24

参照型を値でC#のメソッドに渡したい。それを行う方法はありますか?

C ++では、Valueを渡したい場合は、常にコピーコンストラクターを使用して機能させることができました。C#には、次の以外の方法はありますか。1.新しいオブジェクトを明示的に作成する2. IClonableを実装してから、Cloneメソッドを呼び出す。

これが小さな例です:

コピーコンストラクターを実装するC++のクラスAを見てみましょう。

メソッドfunc1(Class a)、func1(objA)と言うことで呼び出すことができます(自動的にコピーを作成します)

C#にも同様のものがありますか?ちなみに、私はVisualStudio2005を使用しています。

4

4 に答える 4

20

いいえ、C#には同等のコピーコンストラクターはありません。(値で)渡すのは参照です。

ICloneableそれが深いか浅いかが明確に定義されていないため、リスクもあります(さらに、十分にサポートされていません)。もう1つのオプションは、シリアル化を使用することですが、これも、意図したよりもはるかに多くのデータをすばやく取り込むことができます。

メソッドに変更を加えたくないという懸念がある場合は、クラスを不変にすることを検討できます。そうすれば、誰もそれに厄介なことをすることはできません。

于 2008-11-05T08:33:46.783 に答える
8

すでに説明したように、C++のコピーコンストラクターに相当するものはありません。

もう1つの手法は、オブジェクトが不変であるデザインを使用することです。不変オブジェクトの場合、参照の受け渡しとコピーの受け渡しに(セマンティック)違いはありません。これがSystem.Stringの設計方法です。他のシステム(特に関数型言語)は、この手法をさらに適用します。

于 2008-11-05T08:33:14.400 に答える
3

このリンクによると (既に投稿されています): http://msdn.microsoft.com/en-us/library/s6938f28(VS.80).aspx

参照型を値で渡す方法を以下に示します。参照型 arr は値によって Change メソッドに渡されます。

配列が新しいメモリ位置に割り当てられていない限り、変更は元のアイテムに影響します。その場合、変更はメソッドに対して完全にローカルです。

class PassingRefByVal 
{
    static void Change(int[] pArray)
    {
        pArray[0] = 888;  // This change affects the original element.
        pArray = new int[5] {-3, -1, -2, -3, -4};   // This change is local.
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);

        Change(arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);
    }
}

最後に、より詳細な議論については、この質問の Jon Skeet による投稿を参照してください。

C# での参照または値によるオブジェクトの受け渡し

于 2015-11-30T11:31:09.060 に答える
0

これを見てください

public class Product
{
   public string Name;
   public string Color;
   public string Category;

   public Product(Product o)
   {
      this.Name=o.Name;
      this.Color=o.Color;
      this.Category=o.Category;
   } 
   // Note we need to give a default constructor when override it

   public Product()
   {
   }
} 
public Product Produce(Product sample)
{
   Product p=new Product(sample);
   p.Category="Finished Product";
   return p;
}
Product sample=new Product();
sample.Name="Toy";
sample.Color="Red";
sample.Category="Sample Product";
Product p=Produce(sample);
Console.WriteLine(String.Format("Product: Name={0}, Color={1}, Category={2}", p.Name, p.Color, p.Category));
Console.WriteLine(String.Format("Sample: Name={0}, Color={1}, Category={2}", sample.Name, sample.Color, sample.Category));
于 2011-05-21T07:53:28.990 に答える