我很难理解这一点。
如果我们通过variable by reference
我们调用的方法可以通过更改其参数值来更改调用者变量的值。
我的问题是
我们有两个变量
int _myinteger=10;
object _myobject=null;
这里_myinteger
是一个值类型而_myobject
是引用类型变量,我想知道如何通过引用传递这些变量,它是如何改变值的。任何人都可以用一个简单的例子来解释。
谢谢大家
答案 0 :(得分:4)
您可以使用int
命令通过引用传递ref
,object
已经通过引用传递。更具体地说,对象的引用按值传递。
换句话说,默认情况下,值类型按值传递,默认情况下引用类型通过值传递引用。
考虑以下代码:
public void ByRef(ref int i, object o)
两者都通过引用传递。
更新:社群希望澄清此声明。如果您要更改传递的object
上的值,则会在调用者处更改该值。但是,如果您要使用上述签名构建一个新的(例如o = new Object();
),则调用者不会更改。如果您希望它能够正常工作,您需要这样做:
public void ByRef(ref int i, ref object o)
答案 1 :(得分:3)
使用ref关键字,它可以帮助您通过引用传递值。
ref关键字导致参数通过引用传递,而不是通过引用传递 值。通过引用传递的效果是任何改变 方法中的参数反映在基础参数中 调用方法中的变量。参考参数的值是 始终与基础参数变量的值相同。
private void DoSomething(ref int someintByRef)
{
someintByRef = 4;
}
int _myinteger=10;
DoSomething(ref _myinteger);
Console.WriteLine(myinteger);//Prints 4
<强>更新强>
为了更清楚,我会说不使用ref
“值类型”和“引用类型”仅由值传递。区别于“值类型”值(完整实例)将被复制,并且在引用类型“实例的refence”被复制并通过值传递时,将传递全新实例。
当我们使用ref
时,毫无疑问两者都通过引用传递
答案 2 :(得分:0)
对于参考类型:
class User
{
public string Name { get; set; }
public string LastName { get; set; }
}
void ByRef(ref User user)
{
user = new User();
}
void ByVal(User user)
{
user = new User();
}
void Test()
{
var user = null;
ByVal(user);
// user is still null
ByRef(ref user);
// user is new User()
}
答案 3 :(得分:0)
不同类型的变量有不同的行为。如果我们谈论价值类型,它们只包含价值观。不要共享内存位置。所以每种价值类型都有自己的价值观,他们可以随心所欲地玩。另一方面,refrence类型变量本质上是不同的,它们使用共享模式,因此如果我创建一个对象,那么该对象的值将由其用户共享。我重新命令您查看以下视频以获得更多清晰度。
因此,如果将值类型变量传递给方法,则将值的副本分配给using变量。所以如果你想使用相同的变量。然后你可以使用ref keywork来重新定义同一个对象的值。另一方面,对象/引用类型变量不需要是ref关键字,因为它们已经被默认性质重新标记。
尝试以下代码,了解行为。
class Program
{
static object reftypedata = "I am Testing. ";
static int valuetypeData = 10;
static void Main(string[] args)
{
CalcValue(valuetypeData);
CalcValuewithRef(ref valuetypeData);
Calcobject(reftypedata);
Console.ReadKey();
}
public static void CalcValue(int i)
{
Console.WriteLine("Value Type.....");
Console.WriteLine("before Processing i={0}", i);
i = 100;
Console.WriteLine("After Processing i={0}", i);
Console.WriteLine("After Processing valueTypeData = {0}", valuetypeData);
}
public static void CalcValuewithRef(ref int i)
{
Console.WriteLine("Value with Ref Type.....");
Console.WriteLine("before Processing i={0}", i);
i = 100;
Console.WriteLine("After Processing i={0}", i);
Console.WriteLine("After Processing valueTypeData = {0}", valuetypeData);
}
public static void Calcobject(object value)
{
Console.WriteLine("Reference Type.....");
Console.WriteLine("before Processing value={0}", value);
value = "Default Value Has been Changed.";
Console.WriteLine("After Processing value={0}", value);
Console.WriteLine("After Processing reftypedata={0}", reftypedata);
}
}
输出:
Value Type.....
before Processing i=10
After Processing i=100
After Processing valueTypeData = 10
Value with Ref Type.....
before Processing i=10
After Processing i=100
After Processing valueTypeData = 100
Reference Type.....
before Processing value=I am Testing.
After Processing value=Default Value Has been Changed.
After Processing reftypedata=I am Testing.
您也可以参与此youtube video.