2009-06-03 9 views
5
Class c = new Class({ Prop = "Initial" }); 

私は上記のクラスを持っています。それを変更するメソッドをどのように作成しますか?変更したオブジェクトを返すかどうかを確認しますか?

public Class ModifyIt(Class c) 
{ 
    c.Prop = "changed"; 
    return c; 
} 

またはその後、このように呼ばれる

public void ModifyIt(Class c) 
{ 
    c.Prop = "changed"; 
} 

...

Class c = ModifyIt(c); 
Console.WriteLine(c.Prop); 
// changed 

またはこの

ModifyIt(c) 
Console.WriteLine(c.Prop); 
// changed 

いただきましたお好み?

+0

なぜ「クラスx」をパラメータとしてModifyIt()に渡していますか?メソッドを 'this'というクラスインスタンスにするだけではないのですか?コードを与えれば、チェーンに関する他のすべての答えは実際には機能しません。私にとっては、あなたのクラスがより価値の高い型である場合には、インスタンスを変更するのではなく、操作の結果で新しいインスタンスを返すようにしてください。 – van

答えて

2

それを第一の方法、ここであなたが実際にそれを変更した後、アイテムを返していることについてのクールなことは、それはメソッドチェーンを可能にすることです。それはあなたがインスタンスを返した後、チェーン化の必要性を予見することができ、あなたの特定のクラスで理にかなっている場合

c.ModifyIt("hello").MessWithIt("World").ReallyScrewWithIt("!!!"); 

:あなたはこのような何かを行うことができます意味。そうでない場合は、それを無効にすることができます。この良い例が、あなたのような何かをすることを可能にするStringBuilderクラスです:

個人的に
myStringBuilder.Replace("!", "?").Append("Something").Remove(4,3); 
+0

"2番目の方法[...]を行うことについてのクールなことは、メソッドチェーンを可能にすることです。"私はあなたが最初の方法を意味すると思います。申し訳ありませんが、まだ編集できません。 – PatrikAkerstrand

+0

おっと、私の投稿を編集しました、ありがとう! – BFree

6

を、私はcommand-query separationを好む - すなわち、結果を返す方法はミューテーター、およびその逆であってはなりません。私は、return this群衆の引数を理解すなわち、「チェーン」のしやすさは、呼び出します

foo.ChangeThis(23).ChangeThat(45).AndAlso(67); 

が、それは

var x=foo; 
x.ChangeThis(23); x.ChangeThat(45); x.AndAlso(67); 

」の一方、利点として、これらのケースをコーディングすることは間違いなく、あまりにも悪くはありませんwikipeidaのURLで議論されているように(ほとんどの場合、大部分のケースでは、100%ではないにもかかわらず)、コマンドクエリーの分離が行われます。

3

オブジェクトのインスタンスを返すかどうかは、状況に応じて

法による返すオブジェクトのための一般的なケースでは、そのようなStringBuilderクラスとして、builder patternに見られる。このようmethod chainingを実行する予定がない場合は、

new StringBuilder("Hello").Append(" ").Append("World!").ToString(); 

しかし、一般的に、I何も返さないことを選択します。一般的なユースケースでは、返されるオブジェクトを使用しない(そして単にドロップする)ことは無駄であると思われます。あなただけつのプロパティを変更している場合

0

まず第一に、私は全く別の変更機能を持っていないでしょう。私はただプロパティを直接変更したいと思います。それで、変更機能の中でおそらくいくつかの異なる変更を加えて、より複雑なものの簡単な例を与えていると仮定できます。

私は 'Class'オブジェクトを返すものを使用します。複数のコールを連鎖させることができます。繰り返しますが、私はこれが実際にはもっと複雑なシステムの単純な例だと仮定しています。 MakeModification()、MakeAnotherModification()、およびMakeAThirdModification()を使用したとします。この方法は、それゆえ、新しい値が返されることが期待されていないミューテータあるよう代わりに、実際に

Class c = new Class(); 
c.MakeModification().MakeAnotherModification().MakeAThirdModification(); 
0

私は2番目のスタイルを好む:あなたは「クラスのオブジェクトを返す場合は、次の構文微妙を得ることができます実際の値は変更されると予想されます。しかし、実際のcが変更されることを示すために、ModifyItがref変数を受け入れることを示す必要があるかもしれません。ここでは値を渡していますが、参照型ですが、参照型を値渡しと参照型をrefで渡すことには違いがあります。上記の場合で

public void ModifyIt(Myclass c) { c = new MyClass(); } 

C変数が(すなわち、参照からのコピーが渡されると、今度はあなたのことを意味し、新たにinstanitiatedオブジェクト、を指すように変更される値によって渡されます。以下を参照してください。この場合にはMyClass型の2つのオブジェクトを持つことになりますここで説明する例を示します。

Myclass s = new MyClass() { prop = "value" }; ModifyIt(s); Console.WriteLine(s.prob); // this will print "value" 

MOdifyITはそのPROBはnullに初期化されます意味なければならない新しいオブジェクトにreferenctをinstanitaitedけれども、それは実際には」didnのsをインスタンス化すると、caとは異なりsのコピーがインスタンス化されます。 sがrefによって渡された場合はseです。
これが役に立ちます。

1

私は個人的にはModifyItのような関数を作成し、それが可能であれば私が作成しているクラスに置くことを好みます。私がそれを言う理由は両方のメソッドにあります。呼び出し変数を変更しています。原因は参照渡しです。当然ながら、私はすべての関数でそれを行うことはできませんが、関数呼び出しにrefを渡すことは変数を値渡しではなく参照渡しであることを明確にするのに役立ちます。例:

public Class ModifyIt(ref Class c) 

なぜですか?私が戻って来て、私が参照渡しの値を渡したコードを読んだときに、コードに「悪い」ものがある可能性が高いことを忘れてしまいます。

関連する問題