2009-05-06 15 views
16

Bunun şüphe götürmez yararlılığından ayrı olarak, bu satırlar boyunca bir şey yapmanın mümkün olup olmadığını sormak isterim.C# içindeki özel ilkeller?

class MyPrimitive { 
     String value; 
     public String Value { 
      get { return value; } 
      set { this.value = value; } 
     } 
} 

// Instead of doing this... 
MyPrimitive a = new MyPrimitive(); 
a.Value = "test"; 
String b = a.Value; 

// Isn't there a way to do something like this? 
MyPrimitive a = "test"; 
String b = a; 

I get ve set yöntem doğrulama gibi, başka şeyler gerçekleştirmek yapmak için bir özellik kullanarak özel sınıflara ilkel türde kaydırmak gibi.
Bunu sık sık yaptığımdan beri standart ilkel maddeler gibi daha basit bir sözdizimine sahip olmanın güzel olacağını düşündüm.
Yine de, bunun sadece mümkün değil, aynı zamanda kavramsal olarak yanlış olabileceğinden şüpheleniyorum. Herhangi bir anlayış size memnuniyetle karşılanacaktır, teşekkürler.

cevap

29

Bir değer türü kullanın (struct) ve atamanın sağ tarafında istediğiniz türden bir implicit conversion operator verin.

struct MyPrimitive 
{ 
    private readonly string value; 

    public MyPrimitive(string value) 
    { 
     this.value = value; 
    } 

    public string Value { get { return value; } } 

    public static implicit operator MyPrimitive(string s) 
    { 
     return new MyPrimitive(s); 
    } 

    public static implicit operator string(MyPrimitive p) 
    { 
     return p.Value; 
    } 
} 

DÜZENLEME: Yapıyı değiştirilemez yapınız çünkü Marc Gravell kesinlikle haklıdır.

+0

Bu, tam olarak askerin aradığı şeydir. Bu tam olarak bir "özel ilkel" değil, ancak olabildiğince taklit eder ve C# 'da gitmek için doğru yoldur. – Noldorin

+4

Eğer bir yapı oluşturursanız, ** kesinlikle ** bunu aynı anda değişmez yapmalısınız; Bir yapıda {get; set;} olması çok, çok kötü bir fikirdir. Kötülükten bahsetmiş miydim? –

+0

Tamamen kabul edildi, karışıklık için özür dilerim. Aslında, yanlış bir şekilde, örneğini olabildiğince yakından taklit etmeye çalışıyordum. –

1

örtük dökümünü kullanabilirsiniz. Bu tavsiye, ama değil: Yine

public static implicit operator string(MyString a) { 
    return a.Value; 
} 
public static implicit operator MyString(string a) { 
    return new MyString { value = a; } 
} 

, kötü uygulamalar.

+1

Değişmez bir şekilde "kötü uygulama" olduğundan emin değil. Benim düşünceme göre, bağlama bağlı. – Noldorin

+0

Dönüştürme operatörleri referans türlerini kullanarak yeni nesnelerin oluşturulmasını gizler; veya daha kötüsü, değişebilen tipler için (dizge değil) yalnızca sorun yaratabilen eski bir referans döndürür. Bana göre, dönüşüm işleçleri yalnızca değer türlerinde tercih edilir ve referans türlerini yukarı ve aşağı yayınlara bırakılır. –