首先需要强调的是,C#中,函数调用的传值方式和JAVA在若干细节上是不同的。这曾经给我造成了混淆。 在C#中,基本原则是: 1:内置基本类型,外加基本类型的类形式,都是值传递; 2:用户自定义类型,为引用传递; 测试用例: class Program { static void Main(string[] args) { Student student = new Student(); student.Name = "name1"; ChangeStudent(student); //按引用 Debug.Print(student.Name); List<Student> studentList = new List<Student>(); for (int i = 0; i < 5; i++) { studentList.Add(new Student()); } ChangeStudentList(studentList); //按引用 Debug.Print("" + studentList.Count); double d1 = 1.0; ChangeBaseVar(d1); //按值 Debug.Print("" + d1); Double d2 = 1.0; ChangeDouble(d2); //按值 Debug.Print("" + d2); DateTime dt = new DateTime(2010, 2, 2); ChangeDate(dt); //按值 Debug.Print("" + dt.Year); string s1 = "s1"; Change_string(s1); //按值 Debug.Print(s1); String s2 = "s1"; Change_String(s2); //按值 Debug.Print(s2); } static void ChangeStudent(Student studentArg) { studentArg.Name = "name2"; } static void ChangeStudentList(List<Student> studentListArg) { studentListArg.RemoveAt(0); } static void ChangeBaseVar(double doubleArg) { doubleArg = 3.0; } static void ChangeDouble(Double DoubleArg) { DoubleArg = 3.0; } static void ChangeDate(DateTime dateTimeArg) { dateTimeArg = new DateTime(2000, 1, 1); } static void Change_string(string stringArg) { stringArg = "s2"; } static void Change_String(String StringArg) { StringArg = "s3"; } }