我们来看下面的代码,首先定义一个具有继承关系的结构。

代码
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 1 public class Person
2 {
3 private readonly string m_strName;
4 public string Name
5 {
6 get { return m_strName; }
7 }
8
9 public Person(string name)
10 {
11 m_strName = name;
12 }
13
14 public override string ToString()
15 {
16 return string.Format("Name:{0}", m_strName);
17 }
18 }
19
20 public class Employee : Person
21 {
22 private readonly Decimal m_deSalary;
23 public Decimal Salary
24 {
25 get { return m_deSalary; }
26 }
27
28 public Employee(string name, decimal salary)
29 : base(name)
30 {
31 m_deSalary = salary;
32 }
33
34 public override string ToString()
35 {
36 return string.Format("Name:{0}, Salary:{1}", base.Name, m_deSalary);
37 }
38 }

代码
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 1 private static void Test()
2 {
3 Employee emp = new Employee("Wing", 1000);
4 ChangeName(ref emp, "UnKnown", 2000);
5
6 Person person = new Person("Wing");
7 ChangeName(ref person, "UnKnown");
8 }
9
10 private static void ChangeName(ref Employee emp, string newName, Decimal newSalary)
11 {
12 Console.WriteLine(emp);
13 emp = new Employee(newName, newSalary);
14 Console.WriteLine(emp);
15 }
16
17 private static void ChangeName(ref Person person, string newName)
18 {
19 Console.WriteLine(person);
20 person = new Person(newName);
21 Console.WriteLine(person);
22 }
其实ref参数和返回值的区别也在此,方法的返回值是可以支持隐式类型转换的,可以将返回值设置为父类型,然后在实际运行时,返回子类型。
那么如何避免使用ref参数呢,我们可以使用元组,即Tuple。
我们可以看以下的代码。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->1 private static void Tuple<string, Decimal> GetEmpInfo(Employee emp)
2 {
3 return new Tuple<string, Decimal>(emp.Name, emp.Salary);
4 }
ref和out参数表明方法中可以创建出符合声明类型的对象,多态表明派生类总是可以代替基类。不过当方法中需要创建出返回值对象时,上述说法还包含了一些新的含义。当调用代码期待基类对象时,很多情况下方法中都会创建出派生类型对象。总的来说,上述两条规则意味着,out和ref参数无法真正的使用到多态,若是改为使用泛型元组返回多个值,那么你的算法逻辑会更易于使用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-665468/ ,如需转载,请注明出处,否则将追究法律责任。