值类型变量和引用类型变量

时间:2013-11-21 11:45:30

标签: c#

我很难理解这一点。

如果我们通过variable by reference我们调用的方法可以通过更改其参数值来更改调用者变量值。

我的问题是

我们有两个变量

       int _myinteger=10;
       object _myobject=null;

这里_myinteger是一个值类型而_myobject是引用类型变量,我想知道如何通过引用传递这些变量,它是如何改变值的。任何人都可以用一个简单的例子来解释。

谢谢大家

4 个答案:

答案 0 :(得分:4)

您可以使用int命令通过引用传递refobject已经通过引用传递。更具体地说,对象的引用按值传递。

换句话说,默认情况下,值类型按值传递,默认情况下引用类型通过值传递引用。

考虑以下代码:

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.