C#必须知道的问题二

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为执行结果,不能进行赋值运算。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星梦∞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值