`

关于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常用面试题

    var x = 1; var y = 0; var z = 0; function add(n){n=n+1;} y = add(x); function add(n){n=n+3;} z = add(x); [removed] 都为undefined,因为没有返回值。 2.javascript是面向对象的,怎么体现javascript的继承...

    【北交大计算思维课训练题】并发程序(语言C#)

    var = another_var or constant(变量赋值) var += another_var or constant(运算赋值) var -= another_var or constant(运算赋值) print var(输出变量) lock unlock end 现有nn个程序,顺序编号依次为1-n1−n,所有...

    挺好的浮动广告,用于初学的

    var step = 1; var delay = 30; var height = 0; var Hoffset = 0; var Woffset = 0; var yon = 0; var xon = 0; var pause = true; var interval; img1.style.top = yPos; function changePos() { width = ...

    javascript中new Array()和var arr=[]用法区别

    大家在学习javascript中对于数组函数new Array()和var arr=[]很多朋友不知道如何区别,也不知道用法,下面看看我们总结的。 var arr=[] 这是一种字面量定义数组的方法 var arr=new Array() 这是调用数组构造函数...

    微信小程序-微信小程序之Canvas

    We-Canvas ...var p22= data[1][2]; var p23= data[1][3]; var p30= data[2][0]; var p31= data[2][1]; var p32= data[2][2]; var p33= data[2][3]; var t = factor.t; /*计算多项式系数 (下同)*/ var

    js网页日历

    var my_month=my_time.getMonth()+1;//获取月 var my_day=my_time.getDate();//获取今天的号数 var my_week=my_time.getDay();//获取今天的星期 var my_hours=my_time.getHours();//获取小时 var dayfirst=7-...

    百度地图API

    var start = results.getStart(); var end = results.getEnd(); addStart(start.point, start.title); addEnd(end.point, end.title); var viewPoints = [start.point, end.point]; // 获取方案 var plan...

    有记忆功能的动态,静态树型菜单xtree

    var a = new WebFXTreeItem('1'); tree.add(a); var b = new WebFXTreeItem('1.1'); a.add(b); b.add(new WebFXTreeItem('1.1.1')); b.add(new WebFXTreeItem('1.1.2')); b.add(new WebFXTreeItem('1.1.3'));...

    专做主升源码

    顶:=85; 中:=50; 底:=20; VAR1:=HHV(HIGH,9)-LLV(LOW,9);...VAR4:=VAR2/VAR1*100-70; VAR5:=(CLOSE-LLV(LOW,60))/(HHV(HIGH,60)-LLV(LOW,60))*100; VAR6:=(2*CLOSE+HIGH+LOW)/4; VAR7:=SMA(VAR3/VAR1*100,3,1);

    球状标签.rar ) 3d标签

    var lasta = 1; var lastb = 1; var distr = true; var tspeed=10; var size=250; var mouseX=0; var mouseY=0; var howElliptical=1; var aA=null; var oDiv=null; window.onload=function () { var i=0; var...

    SQL中SET和SELECT赋值的区别

    SELECT @VAR1='Y',@VAR2='N' -- 而SET要达到同样的效果,需要: SET @VAR1='Y' SET @VAR2='N' /* 说到这个,SQL内置的变量:@@ERROR 和 @@ROWCOUNT必须要在一句SQL语句中捕获。如果用set分两句来获取它们,将获取...

    flash分支语句实例

    var int2=Number(intin2); var int3=Number(intin3); var intmax1=0; var intmax2=0; if(int1>int2) { intmax1=int1; } else { intmax1=int2; } if(intmax1>int3) { intmax2=intmax1; } else { intmax2=int3; } int...

    JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍

    主要介绍了JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍,需要的朋友可以参考下

    短路逻辑笔试题:var a=10;以下哪个表达式会报错.docx

    JS基础,web前端,短路逻辑笔试面试题 :var a=10;以下哪个表达式会报错 : a<=10&&b==10 a>10&&b==10 a<=10||b==10 a>10||b==10

    缠论源码-飞狐

    var1:="chzhshch@kxian"; var2:="chzhshch@bi";{处理笔关系} pre:=2; {设置小数点位数} if STKTYPE=0 then pre:=1; if STKTYPE=11 then pre:=3; a1:=barslast(var2<>0); a2:=ref(var2,a1); aa1:=ref(a1+1,1); aa2:...

    js加密工具【很实用】附演示代码

    var Jy_eNph1 =window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x67\x65\x74\x45\x6c\x65\x6d\x65\x6e\x74\x42\x79\x49\x64"]("\x69\x64\x78");//项目ID var E2 =window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x67...

    ExtJs选中var editor = new Ext.ux.grid.RowEditor详解

    ExtJs选中var editor = new Ext.ux.grid.RowEditor详解.txt

    javascript 倒计时

    var yue=parseInt(dqTime.substr(5,2),10)-1;//月(parseInt(x,10)将变量转成10进制数),注意:月是“0,1,2,3,4,5,6,7,8,9,10,11,” var ri=parseInt(dqTime.substr(8,2),10);//日 var shi=parseInt(dqTime....

    H5 Canvas炫酷3D线条延伸动画特效.zip

    var cx = w / 2; var cy = h / 2; var fl = 1000; function prj(obj) { var cz = obj.z fl; if(cz === 0) return; var scl = fl / cz; obj.p.x = cx obj.x * scl; obj.p.y = cy obj.y * scl; ...

    JavaScript操作表格

    var lastIndex = objTable.rows.length - 1; objTable.deleteRow(lastIndex); } //添加列 function addCol() { var objTable = document.getElementById("tb2"); var count = objTable.rows[0].cells.length; ...

Global site tag (gtag.js) - Google Analytics