这篇主要是讲一下类
类就是一个模板,就像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那儿说过,意思差不多,这里就不说了
地址见this和static的用法——http://blog.youkuaiyun.com/u012421456/article/details/36410437
访问控制符——http://blog.youkuaiyun.com/u012421456/article/details/25971685
在C#中,访问修饰符还有internal和protected internal(internal就是属性的默认访问权限),这个以后再说
对于一些比较重要的数据,通常禁止类的外部访问,可以用到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("属性类似于字段(成员变量)");
}
}
输出结果为:
关于属性、get和value,还可以参考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中属性语法有了简化的版本,即将上面程序的第21到45行改成下面这样,其功能相同,这样做减少了代码量
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;
}
这个程序会报错,报错提示为:
还可以为get和set指定访问修饰符
可以将上面例子的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下运行通过