1,如何实现按值传递引用类型?
问题阐述:
在 C#中,怎样才能实现按值传递引用类型?
专家解答
1.知识点介绍
引用类型是可以作为参数传递给类型成员的。但是,按引用类型传递一个对象与按值类型传递一个对象是不同的。为了理解这个区别,编写下面的示例来看一下按值类型传递引用类型的应用。
2.示例:
namespace question2
{
class MyInfo
{
//定义一个字符串类型变量存储用户姓名
public string myName;
//定义一个整数类型变量存储用户年龄
public int myAge;
//创建一个带参数的构造函数
public MyInfo(string name, int age)
{
myName = name;
myAge = age;
}
//默认构造函数
public MyInfo() { }
public void printInfo()
{
//创建一个公有方法输出用户年龄信息
Console.WriteLine("{0}年龄是{1}岁", myName, myAge);
}
}
class Program
{
public static void sendAPersonByValue(MyInfo info)
{
//改变info的年龄
info.myAge = 23;
//重新赋值
info = new MyInfo("小明", 24);
}
static void Main(string[] args)
{
//按值传递引用类型
Console.WriteLine("输出用户年龄信息:");
MyInfo fred = new MyInfo("婷子", 22);
Console.WriteLine("未按值传递引用类型前:");
fred.printInfo();
sendAPersonByValue(fred);
Console.WriteLine("按值传递引用类型后");
fred.printInfo();
Console.ReadLine();
}
}
}
运行结果:
输出用户年龄信息:
未按值传递引用类型前:
婷子年龄是22岁
按值传递引用类型后
婷子年龄是23岁
点评:
在按值传递引用类型时,可以改变对象的状态数据,但是却无法将引用重新赋值给一个新对象。这是按值传递引用类型的特点。
2,如何实现按引用传递引用类型?
问题阐述
在C#中,怎样才能实现按引用传递引用类型?
解答
1,知识点介绍
在按引用类型传递引用类型时可以应用ref关键字,该关键字使用参数按引用传递,其效果是:当控制权传递回调方法时,在方法中对参数的任何更改都将反应到该变量中。若要使用ref参数,则方法定义和调用方法都必须显示使用ref关键字。
2,示例
创建一个MyInfo 类,用来存储用户姓名和年龄的信息。代码如下∶
class MyInfo
{
public string MyName;
public int MyAge;
public MyInfo(string myName, int myAge)
{
MyName = myName;
MyAge = myAge;
}
public MyInfo(){}
public void PrintInfo()
{
Console.WriteLine("{0}年龄是{1}岁",MyName,MyAge);
}
}
创建一个 SendAPersonByRef 方法,使其按引用来传递引用类型(注意 ref参数修饰符)。代码如下∶
private static void SendAPersonByRef(MyInfo info)
{
info.MyAge = 23;
info = new MyInfo("小明", 23); //info 现在指向了堆上的一个新对象
}
//按引用传递引用类型
Console.WriteLine("输出用户年龄信息:");
MyInfo fred = new MyInfo("婷子", 22);
Console.WriteLine("未按引用传递引用类型前:");
fred.PrintInfo();
SendAPersonByRef(fred);
Console.WriteLine("按引用传递引用类型后");
fred.PrintInfo();
Console.ReadLine();
在 Main 函数中测试一下创建的 SendAPersonByRef 方法来实现按应用传递引用类型。代码如下∶
//按引用传递引用类型
Console.WriteLine("输出用户年龄信息:");
MyInfo fred = new MyInfo("婷子", 22);
Console.WriteLine("未按引用传递引用类型前:");
fred.PrintInfo();
SendAPersonByRef(fred);
Console.WriteLine("按引用传递引用类型后");
fred.PrintInfo();
Console.ReadLine();
输出结果:
输出用户年龄信息:
未按引用传递引用类型前:
婷子年龄是22岁
按引用传递引用类型后
婷子年龄是23岁
点评:
在按引用传递引用类型时可以使用ref关键字,当然引用传递引用类型时,背调用者可能改变对象的状态数据和所引用的对象,这就是按引用传递引用类型。
3,变量一定要赋初值嘛?
问题阐述
在C#中变量一定要赋初值嘛?
解答
所谓的赋初值就是在定义变量后为其赋的值。但是对于初学者来说,常常在定义了一个变量之后,却忘了给这个变量赋值,这样往往会提示如图2.6所示的错误。
如果那个变量在函数中,就必须为它赋初值;如果是类的成员变量,就不用初始化。
4,为String类型的变量赋空值的方式有几种?
问题阐述
在C#中,变量一定要赋初值,但是我的变量的初值为空,该怎么赋空值?
解答
为 string类型的变量赋空值的代码如下∶
string str=String.Empty;
string str1=null;
string str2="";
点评
string 类型是引用类型,引用类型可以理解为指针,当指针没成立,也就是不知道指哪个方向时就是错误的。所以一定要为 string类型的变量赋初值,即使变量的初值为空。
5,常量中有换行符怎么办?
问题阐述
在程序中出现“常量中有换行符 ”的提示,该怎么办?
解答
1,知识点介绍
这种错误原因是忽略了转义字符。转义字符是一种特殊的字符常量。转义字符以反斜线"\"开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称"转义"字符。例如,"\n"就是一个转义字符,其意义是"回车换行"。转义字符主要用来表示那些用一般字符不便于表示的控制代码。
错误的原因是;C#中的普通字符串(不是@".…."这种字符串)是不能跨行的,编译器会将"后面的\"看成是双引号字符,所以期待另外一个"来结束这个字符串,而这时意外地遇到了换行符,所以编译器给出错误信息"常量中有换行符"。
2,常用的转义字符如表:
点评
在C#中,当字符以“ \”时一定要小心,不要出现上面的错误了。而在“\”在正则表达式中也有应用,如“\d”表示匹配单个数字字符
6,三目运算符怎么出错了呢?
问题阐述
程序中在三目运算处出错。错误是只有 assignment、call、increment、decrement 和 new 对象表达式可用作语句。
解答
1.知识点介绍
三目运算符又叫条件运算符(?∶),根据布尔型表达式的值返回两个值中的一个。如果条件为 True,则计算第一个表达式并以它的计算结果为准;如果为 False,则计算第二个表达式并以它的计算结果为准。
2.示例
在下面的示例中来解决在三目运算符中的错误。
下面的代码将会有错误提示"只有 assignment、call、increment、decrement 和 new 对象表达式可用作语句。",错误的原因是将三目运算符看成了语句。
int a = 10, b = 5;
(a > b) ?a: b;
改正后的代码
int a = 10, b = 5;
int n=(a>b) ?a: b;
Console.WriteLine(n);
点评
"?;"是C#中的三目运算符,不能单独构成语句。如语句"b?x;y",其中b为一个布尔表达式,但是条件表达式要求后面的两个操作数类型兼容,如果b的值为 True,则值为x;如果为False,则值为y。x 和 y为执行结果,不能进行赋值运算。