日期:2014-05-18  浏览次数:20746 次

引用的疑惑
看到引用这部分时,遇到一些问题,请高手耐心解答,如果学的好帮忙讲下函数前的static修饰符什么时候该用,请看一下3个小程序,任意回答一个也有分:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
  class Program
  {
  string s;
   
  void Fn(ref string a, ref string b)
  {
  s = "one";
  a = "two";
  b = "three";
  Console.WriteLine("{0} {1} {2}", s, a, b);
  }
  void G()
  {
  a1.Fn(ref s, ref s);
  }
  static void Main(string[] args)
  {
  Program a1 = new Program();
  a1.G();
   
  }
  }
} // 正确 输出 three three three
 ------------------------------------------------------------
现在对上面的程序稍作修改
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
  class Program
  {
  string s;
   
  void Fn(ref string a, ref string b)
  {
  s = "one";
  a = "two";
  b = "three";
  Console.WriteLine("{0} {1} {2}", s, a, b);
  }
  /*void G()
{
a1.Fn(ref s, ref s);
}*/
  static void Main(string[] args)
  {
  Program a1 = new Program();
  a1.Fn();
   
  }
  }
} //错误 为什么?????????? Error 1 An object reference is required for the non-static field, method, or property 'ConsoleApplication2.Program.s'
-----------------------------------------
书上说 “在作为引用参数传递之前,实际参数必须明确赋值”
为什么第一个程序中的string s没有明确赋值也正确???
而下面这个对整数的引用没明确赋值却错了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
  class Program
  {
   
  static void Fn(ref int a, ref int b) //不用static也要错,什么时候用??????
  {
  a = 1;
  b = 5;
  }
  
  static void Main(string[] args)
  {
  int x;
  int y; //没有明确赋值
  Fn(ref x, ref y);
  }
  }
}
Error 1 Use of unassigned local variable 'x'
Error 2 Use of unassigned local variable 'y'

------解决方案--------------------
不用static也要错,什么时候用?????? Fn(ref x, ref y); 如果不是static方法,就不能在static方法里面直接调用,必须通过实例调用

------解决方案--------------------
For 2

 void Fn(ref string a, ref string b) 

You can't use a1.Fn(); need be a1.Fn(ref s, ref s);

“在作为引用参数传递之前,实际参数必须明确赋值” 

Just for value type, string is reference type

 //不用static也要错,什么时候用?????? 

Because your main function use static (static void Main)

------解决方案--------------------
另外,实际项目中绝对要禁止 a1.Fn(ref s, ref s); 这种写法

------解决方案--------------------
类的字段成员有默认值,而在方法内部的临时变量没有默认值,必须初始化赋值