属性和方法调用不允许作为ref或out参数值使用
2012-05-26 21:51
274 查看
C#允许属性像字段那样使用,只是不允许将它们作为ref或out参数值来传递。ref和out参数值在内部实现时,需要将内存地址传给目标方法。但是,由于属性可能是没有支持字段的虚字段,也有可能是只读/只写的,因此不可能传递其基础存储的地址。所以,你不能将属性作为ref或out参数值来传递。同样的道理也适用于方法调用。如果需要将一个属性或者方法调用作为ref或out参数值来传递,首先必须将值复制到一个变量中,然后传递该变量。方法调用结束之后,再将变量的值赋回属性。
public class Classmates
{
public Person[] Students { get; set; }
public Person Master { get; set; }
public int Age { get; set; }
}
static void Main()
{
Classmates class1 = new Classmates();
Person[] Students = new Person[] { new Person() { Name = "Jim" }, new Person() { Name = "Tom" } };
Person master = new Person() { Name = "JuanJuan" };
class1.Students = Students;
class1.Master = master;
class1.Age = 10;
ChangeName(ref class1.Students[0]);
//ChangeAge(ref class1.Age);
//ChangeMasterName(ref class1.Master);
foreach (var student in Students)
{
Console.WriteLine(student.Name);
}
System.Console.ReadKey();
}
static void ChangeName(ref Person p)
{
p = new Person();
p.Name = "New Guy";
}
static void ChangeMasterName(ref Person p)
{
p = new Person();
p.Name = "New Master";
}
static void ChangeAge(ref int Age)
{
Age = 10;
}
public class Classmates
{
public Person[] Students { get; set; }
public Person Master { get; set; }
public int Age { get; set; }
}
static void Main()
{
Classmates class1 = new Classmates();
Person[] Students = new Person[] { new Person() { Name = "Jim" }, new Person() { Name = "Tom" } };
Person master = new Person() { Name = "JuanJuan" };
class1.Students = Students;
class1.Master = master;
class1.Age = 10;
ChangeName(ref class1.Students[0]);
//ChangeAge(ref class1.Age);
//ChangeMasterName(ref class1.Master);
foreach (var student in Students)
{
Console.WriteLine(student.Name);
}
System.Console.ReadKey();
}
static void ChangeName(ref Person p)
{
p = new Person();
p.Name = "New Guy";
}
static void ChangeMasterName(ref Person p)
{
p = new Person();
p.Name = "New Master";
}
static void ChangeAge(ref int Age)
{
Age = 10;
}
相关文章推荐
- 属性和方法调用不允许作为ref或out参数值使用
- 9.png(9位图)在android中作为background使用导致居中属性不起作用的解决方法
- react 纯函数组件中使用ref属性方法
- 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
- 动态方法调用和使用action元素的method属性
- 解析如何使用反射调用类型成员 方法,字段,属性
- Vue 2中ref属性的使用方法及注意事项
- js使用数组作为参数,直接调用push与apply方法调用push的区别
- 使用反射调用类型成员 方法,字段,属性
- PHP __get()和__set()的使用方法(存取或者调用未定义的属性变量)
- myEclipse使用技巧:查看某方法/属性被调用的情况
- 子类与父类属性或方法重名时,使用super.(属性名/方法名)调用父类型属性或方法
- iOS上的safrai不支持使用关键字作为对象属性名称或方法名称
- vue 使用ref 让父组件调用子组件的方法
- Unity C# 使用反射,利用字符串作为泛型参数调用泛型方法。
- 使用反射调用私有属性和方法
- 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)
- Struts2中使用OGNL调用静态方法及静态属性
- Ruby之旅(二) Ruby的基本语法以及对象的使用,方法的定义及调用,属性的定义及使用
- Vue2中ref属性的使用方法