学习了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()中对象也发生了改变