`

关于var1=var2=something赋值语句的思考

    博客分类:
  • C#
阅读更多

刚才在阅读《c#本质论》一书时,开头有提到var1=var2=something的赋值体,之前也曾用过(但是个人不建议这么使用),但是没有认真思考这种赋值方式的本质问题,即:var1是对var2的引用还是对something的引用。后面我编写了一些PoC代码对此进行验证。

代码片段1:

            #region TestString
            string str1, str2;
            //str1 = str2 = "This is a test string...";
            str2 = "This is a test string...";
            str1 = str2;
            Console.WriteLine("Str1: " + str1);
            Console.WriteLine("Str2: " + str2);
            str2 = "This is another test string...";
            Console.WriteLine();
            Console.WriteLine("Str1: " + str1);
            Console.WriteLine("Str2: " + str2);
            #endregion

 输出的结果是:

Str1: This is a test string...
Str2: This is a test string...

Str1: This is a test string...
Str2: This is another test string...

还是

Str1: This is a test string...
Str2: This is a test string...
Str1: This is another test string...
Str2: This is another test string...

呢?

测试答案是前者。

 

再看看片段2:

class Program
    {
        static void Main(string[] args)
        {
            #region TestObject
            ObjectToTest ott1, ott2;
            //ott1 = ott2 = new ObjectToTest(100);
            ott2 = new ObjectToTest(100);
            ott1 = ott2;
            Console.WriteLine("OTT1: " + ott1.Num);
            Console.WriteLine("OTT2: " + ott2.Num);

            ott2 = new ObjectToTest(150);
            Console.WriteLine("OTT1: " + ott1.Num);
            Console.WriteLine("OTT2: " + ott2.Num); 
            #endregion

            Console.Read();
        }
    }

    class ObjectToTest
    {
        int num;
        public int Num
        {
            get { return num; }
            set { num = value; }
        }

        public ObjectToTest(int num)
        {
            Num = num;
        }
    }

 

输出结果又是如何呢?这里的ott1和ott2都是对象,也就是涉及到引用传递的问题了。我们记new ObjectToTest(100)为obj1, new ObjectToTest(150)为obj2.则在语句ott1=ott2执行后,ott1是对ott2的引用,还是对obj1的引用呢?在后面当ott2=new ObjectToTest(150)执行后,ott1是对obj1的引用还是对obj2的引用呢?

 

执行代码,观看结果为:

OTT1: 100
OTT2: 100
OTT1: 100
OTT2: 150

可知,这里的ott1只是对obj1的引用,而非obj2的引用。

1
1
分享到:
评论

相关推荐

    js隐式全局变量造成的bug示例代码.docx

    在这个示例中,`test()`函数内部的`pageNo`赋值语句实际上创建了一个全局变量`pageNo`。因为没有使用`var`、`let`或`const`进行声明,这行代码等效于在全局作用域中声明了一个新的变量`pageNo`并赋值为1。这样,原本...

    Cocos-Creator手册—来源于网络.docx

    可以通过以下方式创建一个数组:`var arr = [1, 2, 3];` - 访问数组中的元素非常直观,例如:`var firstElement = arr[0];` 这样就可以获取数组的第一个元素。 **1.6 JavaScript 对象(Object)** - 对象是...

    30个你 “ 不可能全部会做 ” 的javascript题目及答案

    条件语句 `(val === 'value')` 为真,所以输出 "Something"。 5. IIFE(立即执行函数表达式)内的 `name` 是局部变量,所以内部的 `name` 不会覆盖外部的 `name`。因此,输出是 B. Hello World。 6. 表达式 `var ...

    JS方面总结

    8. **条件语句后阻止执行后续语句**:在满足条件后,使用`return`语句可以停止当前函数的执行: ```javascript if (condition) { // do something return; } // 下面的代码不会执行 ``` 9. **刷新父页面**:...

    Unity脚本 初学者笔记(转载)

    - 示例:`var a:int = 1;` 2. **浮点型 `float`**:用于存储带小数点的数值。 - 示例:`var b:float = 0.05;` 3. **游戏对象引用 `GameObject`**:存储对Unity中某个GameObject的引用。 - 示例:`var c:...

    超实用的javascript代码段30道题目答案.pdf

    这是因为`var`声明的变量作用域在整个函数内部,但在函数内部的`if`语句中重新初始化了`name`,所以外层的`name`未被赋值,因此是`undefined`。 6. `for (var i = START; i <= END; i++) {count++;}`的结果是C,101...

    C#6.0新特性

    这种方式特别适用于需要在循环或条件语句中声明变量的情况。 #### 5. 静态的 Using (Static Using) C# 6.0 引入了静态 using 语法,使得无需指定完整的类型名称即可调用静态方法或访问静态字段。 **之前的实现...

    Swift变量和常量的不同使用方法

    let (x, y) = (1, 2) // 声明并初始化两个常量 var (width, height) = (100, 200) // 声明并初始化两个变量 ``` 在 Swift 的控制流语句中,如`switch`,`let`还可以用于临时捕获匹配的值。例如: ```swift let ...

    JavaScript语言精粹

    1. **变量声明**:使用`var`关键字声明变量,避免使用全局变量。 - 示例:`var message = "Hello World";` 2. **数据类型**: - 原始类型:包括数字(Number)、字符串(String)、布尔(Boolean)、空值(null)、未定义...

    plsql基本语法ppt

    例如,我们可以用SELECT语句获取数据并赋值给变量: ```sql num_var := (SELECT column_name FROM table_name WHERE condition); ``` 3. **控制结构**: - **条件语句**:IF-THEN-ELSIF-ELSE结构用于根据条件...

    oracle转DB2 对照

    SELECT * FROM table1 LEFT OUTER JOIN table2 ON (table1.id = table2.id); ``` - DB2示例: ```sql SELECT * FROM table1 LEFT OUTER JOIN table2 ON (table1.id = table2.id); ``` - 注意点: Oracle和DB2...

    非常全的 S4 ABAP 新语法(适用S4不适用ECC等老系统)

    10. **SWITCH**: `SWITCH`语句提供了基于值的多分支选择,替代传统的`CASE`结构,例如:`SWITCH TO my_variable CASE 'value1' DO something CASE 'value2' DO another_thing ENDSWITCH.` 11. **COND**: `COND`...

    Oracle plsql 参考文档

    2. **执行部分**:这是PL/SQL的主要部分,包含一系列的语句,如赋值、控制结构(IF、CASE、WHILE、FOR循环)以及数据库操作。例如,简单的赋值操作: ```sql num := 10; ``` 3. **异常处理部分**:PL/SQL允许...

    ADO.NET Entity Framework 教程

    - **隐式类型**:使用 `var` 关键字声明变量时,编译器会根据赋值语句自动推断变量的类型。例如: ```csharp var queryResult = from c in Customers select new { c.Name, c.Age }; ``` 在这里 `queryResult` ...

    reference.pdf

    - **细节**: 变量通过赋值语句创建,并且可以在局部作用域或全局作用域中使用。 - **示例**: 在函数内部定义变量只在该函数的作用域内可见: ```python def my_function(): x = 5 # x 只在函数内部可见 ``` ##...

    SAS编程技术数据步修改与选择观测PPT课件.ppt

    首先,赋值语句是数据步中最基础的操作之一,其基本格式为`variable=expression;`。在这个语句中,`variable`是你想要赋值的目标变量,而`expression`则是一个表达式,其结果将被赋给目标变量。例如,在例子中,`x=a...

    Game_Maker_Language教程_gm8gamemaker8gml_

    Game Maker Language(GML)是GameMaker Studio的脚本语言,用于创建复杂的2D游戏。这个教程,"Game_Maker_Language教程_gm8gamemaker8gml_",旨在帮助初学者和进阶开发者理解GML的基础和高级概念。GML在设计时考虑...

    javaScript基础关键字介绍.docx

    1. **var** - 声明一个变量,作用域为函数作用域或全局作用域。 - 示例: ```javascript var message = "Hello"; ``` 2. **let (ES6+)** - 声明一个块级作用域的变量。 - 示例: ```javascript let ...

    Python进阶

    1. **一切皆对象**: 函数也是对象,可以被赋值给变量、作为参数传递给其他函数或从函数中返回。 2. **在函数中定义函数**: 在一个函数内部定义另一个函数。 3. **从函数中返回函数**: 函数可以返回另一个函数。 4. *...

    kotlin文档

    val result = (1..10).map { it * 2 } // 使用 lambda 表达式对集合中的每个元素乘以 2 ``` #### 三、面向对象编程 **3.1 类与继承** - **类的定义**:Kotlin 中的类可以通过 `class` 关键字定义。 ```kotlin ...

Global site tag (gtag.js) - Google Analytics