初学C#_6


这篇主要是讲一下类

类就是一个模板,就像C中的结构体,只不过功能更多,它的三个主要特征,封装、继承和多态我们将为类创建对象的过程称为实例化,而对象是类的实例C#的这些和Java的类的用法在格式上市比较相像的,像前边的程序,都是写在一个Progrom类中的,因为这个是VS新建工程后自带的,我在写例子时,就没有修改过,我看这一章内容,会根据我当初学Java时的情况做参考

C#中,成员变量被也被称为字段,也可以把变量和方法都叫做属性

还是举例子

1

using System;

class Test  //定义了另一个类
{
    public string str0;  //如果不被声明为public,则无法被对象调用
    public void Print()  //在类中定义方法(不是静态的方法,因为静态方法处在类外面的对象无法调用)
    {
        string str1 = "一个字符串变量";  //这是一个字段(成员变量)
        Console.WriteLine(str1);
        Console.WriteLine("天气转凉了,要多加衣服!");
    }
}

class Program  //这是包含Main方法的类,大家都知道,程序是从Main方法开始执行的
{
    static void Main(string[] args)
    {
        Test test = new Test(); //使用new为类实例化一个对象,对象名是任意的(只要是一个合法的标识符)
        test.str0 = "可以直接调用类中的字段";
        test.Print(); //使用对象调用其类中的方法

        Console.ReadLine();
    }
}
输出结果为:



关于this和访问修饰符,以前在java那儿说过,意思差不多,这里就不说了

地址见thisstatic的用法——http://blog.youkuaiyun.com/u012421456/article/details/36410437

访问控制符——http://blog.youkuaiyun.com/u012421456/article/details/25971685

C#中,访问修饰符还有internalprotected internalinternal就是属性的默认访问权限),这个以后再说


对于一些比较重要的数据,通常禁止类的外部访问,可以用到private,然而这种形式的封装过于彻底,所以许多情况下都是使用get set

2

using System;
 
class Program
{
    static void Main(string[] args)
    {
        Test test = new Test(); 
        test.str0 = "使用get、set和value关键字";
        test.str1 = "可以定义属性";
 
        test.Print(test.str0);
        test.Print(test.str1);
 
        Console.ReadLine();
    }
}
 
class Test  //定义了另一个类,也可以把这个类放到包含Main方法的类的下边
{
    //这是定义了属性str0和str1
    public string str0
    {
        get  //get表示取得str0这个变量的值,即只读
        {
            return _str0;
        }
        set  //set表示可以对该变量进行赋值操作,即只写
        { 
            _str0 = value;//使用value关键字来引用赋值运算(即等号 =)的右侧部分
        }
    }
    private string _str0;//此变量名是任意的(只要是一个合法的标识符)
    /*-----下同-----*/
    public string str1
    {
        get
        {
            return _str1;
        }
        set
        {
            _str1 = value;
        }
    }
    private string _str1;
 
    public void Print(string str)  //向方法中传值
    {
        Console.WriteLine(str);
        Console.WriteLine("属性类似于字段(成员变量)");
    }
}
输出结果为:



关于属性、getvalue,还可以参考MSDN

属性——http://msdn.microsoft.com/zh-cn/library/x9fsa0sw.aspx

get——http://msdn.microsoft.com/zh-cn/library/ms228503.aspx

value——http://msdn.microsoft.com/zh-cn/library/a1khb4f8.aspx

 

C#3.0中属性语法有了简化的版本,即将上面程序的第2145行改成下面这样,其功能相同,这样做减少了代码量

 public string str0 { get; set; }  
 public string str1 { get; set; }


下面的例子提供了属性验证

3

using System;
 
class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
 
        test.str0 = null;
        //test.str0 = "";
        //test.str0 = "提供属性验证";
        test.Print(test.str0);
 
        Console.ReadLine();
    }
}
 
class Test 
{
    public string str0
    {
        get 
        {
            return _str0;
        }
        set  
        {
            if (value == null)
            {
                throw new ArgumentNullException();
            }
            else
            {
                value = value.Trim();  //移除字符变量值左右的任何空白字符
                if (value == "")
                    throw new ArgumentNullException("不要赋空串");
                else
                    _str0 = value;
            }
        }
    }
    private string _str0;
 
    public void Print(string str)  
    {
        Console.WriteLine(str);
        Console.WriteLine("属性类似于字段(成员变量)");
    }
}
输出结果为:



当第9行或第10行不再注释,而第11行进行注释后,结果为:



4

using System;
 
class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
 
        test.str0 = "天变冷了!";
 
        Console.ReadLine();
    }
}
 
class Test 
{
    public string str0
    {
        get 
        {
            return _str0;
        }
    }
    private string _str0;
}
这个程序会报错,报错提示为:



还可以为getset指定访问修饰符

可以将上面例子的Test类修改为:

class Test 
{
    public string str0
    {
        get 
        {
            return _str0;
        }
        private set
        {
            _str0 = value;
        }
    }
    private string _str0;
}

这样,该属性str0对于Test类来说是可以正常读写的,而对于其它的类则是只读的,需要注意的是:这个访问修饰符的“限制性”必须比其属性的访问限制符更加严格,否则会报错


      这些博客主要是讲我在学C#(我主要看的书是《C#本质论第三版》)的过程中,发现它和C/C++Java的不尽相同之处,都是自己的见解,也是比较浅显的知识,如有错误,欢迎指出

如无说明,所有程序都是在Visual Studio 2012下运行通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值