C++では、正しく覚えていれば、関数へのパラメータは、参照として渡すことを示す&
が指定されていない限り、値渡しされます。例えば C#での参照渡しがC++と比較してどのように動作するかについては正しいですか?
int double (int i)
{
int twice = i * i;
return twice;
}
int main ()
{
int i = 4;
int j = double(i);
return 0;
}
int i = 4;
// --- here's the part where the function runs ---
int temp = i;
int twice = temp * temp;
i = twice;
// -----------------------------------------------
に相当し、int
をデータ型であるので、それはC#で同じように機能するであろう又は値型(私はき両方の用語が使われていると聞いた)。あなたがC#で参照型またはオブジェクトと呼ばれるものを渡すとき
物事が異なって取得することです。 C++では、&
で修飾せずにclass
を渡すと、この関数はパラメータのディープコピーを使用しているかのように機能します。
たとえば、次のC++では、Charlie
のAge
がインクリメントされません。
class Dude
{
pulic Dude (name = "", age = 0) : Name(name), Age(age) { }
public string Name;
public int Age;
}
public void IncrementDudeAge (Dude dude)
{
++dude.Age;
}
int main ()
{
Dude Charlie = new Dude ("Charlie", 69);
IncrementDudeAge(Charlie);
std::cout << Charlie.Age; // prints 69
}
main
はC#で同じコードがAge
をインクリメントするであろうので、これは、C#とは異なる
Dude Charlie = new Dude ("Charlie", 69);
Dude temp = new Dude("Charlie", 69);
++temp.Age;
std::cout << Charlie.Age; // prints 69
と等価である:
public class Program
{
public static void IncrementDudeAge (Dude dude)
{
++dude.Age;
}
public class Dude
{
public string Name { get; set; }
public int Age { get; set; }
}
public static void Main()
{
Dude Charlie = new Dude() { Name = "Charlie", Age = 69 };
IncrementDudeAge(Charlie);
Console.WriteLine(Charlie.Age); // prints 70
}
}
コードのそのビットはCと等価である++コードのように
class Dude
{
pulic Dude (name = "", age = 0) : Name(name), Age(age) { }
public string Name;
public int Age;
}
public void IncrementDudeAge (Dude * dude)
{
++*dude.Age;
}
int main ()
{
Dude Charlie = new Dude ("Charlie", 69);
IncrementDudeAge(&Charlie);
std::cout << Charlie.Age; // prints 70
}
つまり、上記2つのコードではCharlie
の別名を渡しています。Charlie
を指しているもののコピーです。 C++では、エイリアスは実際の整数型ですが、C#ではエイリアスと考えることができます。
両方のケースでは、Charlie
を指して何かのコピーですので、あなたが彼を再割り当てしようとした場合、あなたが実際Charlie
には影響しません。
public void IncrementDudeAge (Dude * dude)
{
dude = new Dude ("Charlie", 70);
}
と
public static void IncrementDudeAge (Dude dude)
{
dude = new Dude() { Name = "Charlie", Age = 70 };
}
何もしないだろう。 C#でref
、またはC++で**
または*&
を使用する必要があります。
私はすべてについて正しいですか?
を:C#では、すべてのパラメータは、あなたが 'ref'または' out'キーワードを使用しない限り、値によって渡されていますが、C# 'class'オブジェクトを渡す時にしていますオブジェクトへの参照は値渡しされます。 C# 'struct'オブジェクト、または他の値型(組み込みの整数や浮動小数点型など)を渡すと、オブジェクト全体がスタックにプッシュされます。 –