学习了Struct后,简单尝试一下
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication4
{ public struct local { private int xVal; private int yVal;public local(int x, int y)
{ xVal = x; yVal = y; }public int x
{ get { r eturn xVal; } set { xVal = value; } } public int y{ get { return yVal; } set { yVal = value; } } public override string ToString() { return (String.Format("{0},{1}",xVal,yVal)); } }}
struct中的变量默认是private的,所以如果想要引用的话,可以采用C#已经封装好的方式如下:
public int y{
get { return yVal; } set { yVal = value; }}主程序:
简单输出x,y的值:
关于结构体需要注意的是:
(1)struct中的成员变量不可以赋值:
private int x = 50;
private int y = 100;
会报错
(2)struct是值类型
在以上程序中,Writeline()的参数是一个对象,而local是一个结构体。为什么不会报错呢
原因是,编译器讲结构体自动封箱了(就像所有值类型一样),而且创递给Writeline的是封箱后得到的对象。
struct(隐式)地从object继承,可以多态的进行反应,重定义方法
可以将上面代码片段改为
console.Writeline("local location:{0}",local.ToString());避免装箱
但是,若在myFunc()中新值被赋给x,y后输出:
local loc1 :50,100
当返回调用方法Main()并再次调用Writeline()时,原值并没有改变:
locallocation :200,300
结构体是作为一个值对象传递的,myFunc()中只是一个副本
把声明类改为 : public class local
并再次运行程序,输出是:
local location : 200,100
in myFunc location:50,100
local location:50,100
这次location对象也有了引用语意,因此当值在myFunc()中发生改变时,main()中对象也发生了改变