2012-03-08 6 views
8

メソッドEnvironment.GetCommandLineArgsを作成したチームの設計上の考慮事項を理解しようとしています。Environment.GetCommandLineArgs - なぜそれがメソッドですか?なぜ不動産ですか?

これは、非常によくSystem.Web.HttpContext.Currentのような静的なプロパティでした。結局のところ、戻り値は一度利用可能に変更してはなりません。つまり、現在実行中のプロセスのプロパティに似ています。

私は、.NETのどのプロパティもgetter/setterメソッドの構文的な砂糖であることを知っています。しかし、明示的なgetterメソッドではなく、プロパティを使用する正確な理由です。

ここには何かがありますか?

あなたはどう思いますか?

+1

BCLチームは、プロパティとメソッドの意味的な違いを尊重しました。プロパティは、プログラマがフィールドへのアクセスと同等の呼び出しを行うことができるかどうかを検討する必要がある場合にのみ使用されます。この場合、 'GetCommandLineArgs'はそのように動作しないので、メソッドです。毎回値を取得または計算すると考えてください。 –

答えて

4

私はあなたがそれを呼び出すたびに配列のコピーを作るからだと思う。たとえば、次のプログラムを考えてみてください。

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     string[] argsCopy = Environment.GetCommandLineArgs(); 
     args[0] = "x"; 

     // 0 is the command in this case 
     argsCopy[1] = "y"; 

     string[] argsCopy2 = Environment.GetCommandLineArgs(); 
     Console.WriteLine(argsCopy2[1]); 
    } 
} 

"test original"でこれを実行すると、 "original"が出力されます。

は、だからあなたが言うとき:

は、すべての後、返される値は一度利用可能変更すべきではありません。

実際には、アレイは常に変更可能であるからこそ、すべての呼び出しで異なる値(新しい配列参照)を返します。

+0

うーん、良い点があります。私はあなたが正しいと思います。元の配列の**コピー**でなければならないので、各呼び出しのための新しい配列です。 –

+0

私は['IReadOnlyList '](http://msdn.microsoft.com/en-us/library/hh192385%28v=vs.110%29.aspx)がフレームワークに長い間存在していたはずだと思います配列の代わりにたくさん使用しました。 – svick

+0

@svick:もちろんですが、ジェネリック医薬品の前にそれをするのは難しいでしょう... –

0

私の理解から、方法はアクション(何かを行う)に使用されます。メソッドを呼び出すと、計算やデータベースリポジトリへの呼び出しのような大きなロジック(ger)が発生します。プロパティは、基本的に変数を取得または設定するためのものです。人の名前が必要な場合は、 'Name'というプロパティを持ち、person.Nameという名前ではなくperson.Name()という名前で呼び出すことになります。しかし、あなたがその人の年齢を欲しがっていて、誕生日だけがあれば、年齢の計算の基本ロジックを持つGetAge()メソッドがあるでしょう。多分私はここで完全に間違っているかもしれませんが、私の理解は、コードやロジックの大きな断片にはメソッドが使われているのに対し、プロパティは単に値を設定し値を取得するために使われるということです。

関連する問題