2009-05-06 6 views
16

疑わしい有用性は別として、これらの行に沿って何かをすることが可能かどうかを質問したいと思います。私はgetset方法を作るためにプロパティを使用してカスタムクラスにプリミティブ型をラップしたいとC#のカスタムプリミティブ?

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; 

は、検証のような、他のことを行います。
私はこれをかなり頻繁にやっているので、標準のプリミティブのように、より単純な構文も良いと思っていました。
それでも、これは実行可能ではないだけでなく、概念的に間違っている可能性があると私は思っています。 洞察力は大歓迎です。ありがとうございます。

答えて

29

値タイプ(struct)を使用して、割り当ての右側にあるタイプからimplicit conversion operatorを指定します。

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; 
    } 
} 

編集:Marc Gravellが絶対に正しいので、構造体を変更できません。

+0

これは、尋問者が探しているものです。これはまさに「カスタムプリミティブ」ではありませんが、可能な限り同様に模倣し、C#に入る正しい方法です。 – Noldorin

+4

これを構造体にする場合は、**絶対に**同時に変更できないようにする必要があります。構造体に{get; set;}を持つことは非常に悪い考えです。私は悪いことを言いましたか? –

+0

完全に同意しました。混乱して申し訳ありません。私はもともと、間違って、できるだけ彼の例を真似しようとしていました。 –

1

暗黙のキャストを使用できます。お勧めしませんが、

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

また、悪い習慣です。

+1

必ずしもそれが "悪い習慣"であるかどうかはわかりません。私の意見では、文脈によって異なります。 – Noldorin

+0

参照型で変換演算子を使用すると、新しいオブジェクトのインスタンス化が隠されます。文字列ではなく変更可能な型の場合にのみ問題を引き起こす可能性のある古い参照を返します。 私には、値の型の変換演算子でのみ、参照型をアップおよびダウンキャストにすることが望ましいです。 –