2011-10-29 6 views
1

上記のコードでプロパティタイプとは異なるタイプを設定する設定者がいるのは正しいですか?

[XmlAttribute("Type")] 
    public string DataTypeString 
    { 
     get 
     { 
      return _dataType.ToString(); 
     } 
     set 
     { 
      _dataType = Type.GetType(value); 
     } 
    } 

    private Type _dataType; 

    public Type DataType 
    { 
     get { return _dataType; } 
     set { _dataType = value; } 
    } 

、最初のプロパティのタイプはのSystem.Type

+1

これはプロパティの全体的なポイントではありません - それらは基礎となるフィールドから抽象レベルを提供します。 – James

+4

1つのプロパティに対して2つのgetter/setterを持っていると私には奇妙に見えますが –

答えて

0

のあなたができることを確認している文字列、しかしセッターセット、_dataTypeです。それがプロパティの目的です。プロパティのユーザーは、その背後にあるものを知る必要はありません。彼/彼女はちょうどセットまたは文字列を取得し、それは彼らが知る必要があるすべてです。

+0

型が見つからない場合、フィールドにnull値が割り当てられる可能性があります。それは難しいバグにつながる可能性があります。 –

+0

@ Kirk、これは例外をスローすることで簡単に修正できます。 –

+1

@MatthewFlaschen私たちは実際にはプロパティで例外をスローしたくないのです – James

3

getプロパティでは、これを行うことができます。

設定されたプロパティの型変換は、より反論的である可能性があります。通常、プロパティは軽量であると予想され、例外をスローすることはなく、x.YYY=newValue;x.YYY==newValueになると予想されます。これらは型変換が行われると実現しにくい場合があります。

I.e.あなたの特定の例では、文字列で型を設定できるようにプロパティが悪い考えのように感じる - 期待される振る舞いはx.DataTypeString="42";ですか?私はその[OK]を推測

+0

それは完全に正しいです。しかし、それがプロパティを使うことは良いことかもしれません。彼は、文字列がプロパティ内の有効な型に対応していることを検証して、割り当てが必要なたびにその文字列の外側で行う必要はありません。 –

0

...あなたの財産のXMLシリアル化を可能にするために他の方法を検討する必要がありますが、私はあまり奇数とそれほど冗長、単にこれを行うことを好むだろう:

public void SetDataType(string value) { 
     _dataType = Type.GetType(value); 
    } 

    public void SetDataType(Type value) { 
     _dataType = value; 
    } 

    public Type DataType { get; private set; } 

すでに述べたように、同じプライベート変数に対して2つのゲッタ/セッタのペアを持つことはむしろ奇妙に思えます。

0

このクラスの目的を知らずに言うのは難しいです。しかし、一般的には、同じバッキングフィールドを持つ2つのプロパティを持つことで混乱してしまうと思います。

ただし、例外はあります。たとえばCircleクラスでは、RadiusプロパティとDiameterプロパティの両方を持つことが理にかなっています。もう一度、それはあなたのクラスの目的にかかっています。

また、提供した例では、DataTypeStringプロパティが多くの利点を提供するようには見えません。あなたはそれを削除した場合、発信者は、単に

foo.DataType = Type.GetType("System.Int32"); 

または

string dataTypeString = foo.DataType.ToString() 

を呼び出すことによって、同じ効果を得ることができました。

関連する問題