13.C# 定义类成员
1.定义字段
class MyClass
{
public int MyInt;
}
字段可以用readonly修饰,表示该字段只能在构造函数中赋值,还可以用static表示该字段是静态字段
class MyClass
{
public int MyInt=;//注意公共字段使用PascalCasing标准命名,即每个单词首字母大写
private int age=; //私有变量用camelCasing标准命名,首字母小写,之后每个单词首字母大写
public int StaInt =;
}
2.定义属性
class MyClass
{
private int myInt;
public int MyInt{
get{return myInt;}
protected set { myInt=value;}//set访问器只当前类和继承该类的子类能访问
} }
属性拥有两个类似函数的块,称为访问器,可以忽略其中一个访问器来创建只读或只写属性。访问器可以拥有自己的访问修饰符,但访问性不能高于它所属的属性。属性可以用abstract、virtual、override修饰,但不能用于字段。
C#提供了一种定义属性的简写方式,可以不用定义私有字段,编译器会自动添加一个用于存储该属性的字段,但我们不知道该字段叫什么,无法直接对该字段进行修改。
public int MyInt { get; set; }
3.定义方法
class MyClass
{
public void GetString()
{
Console.WriteLine("AAAA");
}
}
方法可以用可访问修饰符public、protected、internal、private修饰,默认为private;非访问修饰符virtual、override、abstract、sealed、extern、static修饰,extern表示方法定义放在其他地方
4.隐藏基类方法
当基类的方法不像预期的那样工作时可以使用new关键字隐藏基类的方法,如
class Program
{
static void Main(string[] args)
{
MyClass a = new MyClass();
a.DoingSomething();//子类方法
MyBaseClass b = a;
b.DoingSomething();//基类方法
Console.ReadLine();
}
} class MyBaseClass
{
public void DoingSomething()
{
Console.WriteLine("基类方法");
}
} class MyClass : MyBaseClass
{
public new void DoingSomething()
{
Console.WriteLine("子类方法");
}
}
隐藏基类方法时,使用子类对象调用访问的是子类的方法,使用父类对象调用访问的是父类的方法,注意隐藏和重写的区别,重写时不管用子类还是父类对象调用方法,都将访问的是子类的方法(多态性),如下
class Program
{
static void Main(string[] args)
{
MyClass a = new MyClass();
a.DoingSomething();//子类方法
MyBaseClass b = a;
b.DoingSomething();//子类方法
Console.ReadLine();
}
} class MyBaseClass
{
public virtual void DoingSomething()
{
Console.WriteLine("基类方法");
}
} class MyClass : MyBaseClass
{
public override void DoingSomething()
{
Console.WriteLine("子类方法");
}
}
5.调用重写或隐藏的基类方法
有时候可能是在父类方法的基础上做修改,这样在重写方法时就需要调用父类的方法,可以使用base关键字调用重写的父类方法
class MyBaseClass
{
public virtual string DoingSomething()
{
return "父类方法";
}
} class MyClass : MyBaseClass
{
public override string DoingSomething()
{
return base.DoingSomething()+ " 子类方法";
}
}
注:base代表的是父类的对象实例,所以不能在静态方法中调用
6.this 关键字
this关键字代表当前类的对象实例,可以使用this关键字访问当前对象的实例成员。和base一样this不能用在静态方法中
class MyClass
{
public void DoingSomething(object o)
{
this.WriteSomething(this);//用this调用成员方法,并把当前对象实例传给该方法
} public void WriteSomething(MyClass c)
{
Console.WriteLine(c.ToString());
}
}
7.接口的实现
interface IMyInterface
{
void DoingSomething();
void DoingSomethingElse();
} class MyClass : IMyInterface
{
public void DoingSomething()
{
} public void DoingSomethingElse()
{
}
}
也可以在基类中实现接口成员,如
interface IMyInterface
{
void DoingSomething();
void DoingSomethingElse();
} class MyBaseClass
{
public void DoingSomething()
{
}
} class MyClass : MyBaseClass
{
public void DoingSomethingElse()
{
}
}
父类中实现了方法DoingSomething,子类只要实现剩余的方法即可
以上两种方法是隐式的实现接口,下面是显示实现接口的方法
interface IMyInterface
{
void DoingSomething();
void DoingSomethingElse();
} class MyClass : IMyInterface
{
void IMyInterface.DoingSomethingElse()
{
} void IMyInterface. DoingSomethingElse()
{
}
}
隐式实现接口和显式实现接口的区别在于:隐式实现接口需要用public修饰实现的成员,而显式实现的成员不能有访问修饰符修饰,并且需要用接口名.成员名限定实现的接口成员。
除了语法上的区别外,显式实现的接口成员只能通过接口访问,隐式实现的成员可以通过接口和类来访问。即
显式实现的接口成员只能用如下方式访问
IMyInterface b = new MyClass();
b.DoingSomething();
隐藏实现的可以这两种方式都可以
MyClass a = new MyClass();
a.DoingSomething();//子类方法
IMyInterface b = new MyClass();
b.DoingSomething();
8.嵌套类型的定义(内部类)
C#类内部不仅可以定义方法、变量等成员,也可以在类内部定义类,此时内部类不仅能使用public、internal关键字修饰,还可以使用private、protected修饰
public class MyClass
{
public class myNestedClass
{
public int nestedClassField;
} public myNestedClass GetInternalClass()
{
return new myNestedClass();
}
}
如果内部类是public或者internal的就可以在MyClass类外部定义内部类的实例,但必须用限定名称
MyClass.myNestedClass n = new MyClass.myNestedClass();
9.部分类
C#可以使用部分类定义,把类的定义放在多个文件中。如把字段、属性和构造函数放在一个文件,而把方法放在另一个文件。部分类定义对于用来隐藏窗口布局代码非常有用
public partial class MyClass
{
//类体
}
应用于部分类的接口会应用于整个类,下面两种方式是等价的
方式一:
public partial class MyClass:IMyInterface1
{
//类体
} public partial class MyClass:IMyInterface2
{
//类体
}
方式2:
public class MyClass:IMyInterface1,IMyInterface2
{
//类体
}
10.部分方法
可以在部分类中定义部分方法,在一个部分类中定义部分方法,但不包含方法体,在另一个部分类中包含实现代码
public partial class MyClass
{
partial void MyPartialMethod();
} public partial class MyClass
{
partial void MyPartialMethod()
{ }
}
部分方法可以是静态的,但是部分方法总是private,且不能有返回值,它们使用的参数也不能是out类型。因为部分方法如果没有方法体,编译器会完全删除该方法。如果方法有返回值,那么该方法就可以作为表达式的一部分,如
int a =Func(a,b)
如果Func是部分方法且没有方法体,那么编译器就不知道怎么执行上一句代码;同样如果输入参数是out类型,因为out类型的参数必须在方法体内赋值,如果没有方法体就会有问题。
分部方法不能具有访问修饰符或 virtual、abstract、override、new、sealed 或 extern 修饰符
13.C# 定义类成员的更多相关文章
- 使用prototype 对象定义类成员
使用prototype 对象定义类成员上一节介绍了类的实现机制以及构造函数的实现,现在介绍另一种为类添加成员的机制:prototype 对象.当new 一个function 时,该对象的成员将自动赋给 ...
- C#定义类成员
1.成员定义 public--成员可以由任何代码访问. private--成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字). internal--成员只能由定义它的程序集(项目 ...
- java类成员的默认可访问性是什么?你猜
先看下面TestModel: import org.apache.commons.collections4.BidiMap; import org.apache.commons.collections ...
- PHP中如何定义类及其成员属性与操作
1.类的定义: i. 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ 成员属性........ 操 ...
- Kotlin入门(13)类成员的众生相
上一篇文章介绍了类的简单定义及其构造方式,当时为了方便观察演示结果,在示例代码的构造函数中直接调用toast提示方法,但实际开发是不能这么干的.合理的做法是外部访问类的成员属性或者成员方法,从而获得处 ...
- PHP如何定义类及其成员属性与操作
1.类的定义: 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ //成员属性 $name = ' ...
- c++模板类成员的声明和定义
c++模板类成员的声明和定义应该都放在*.h中,有普通类不一样. 如果定义放在*.cpp中,最终链接时,会报方法undefined错误. 参考:http://users.cis.fiu.edu/~we ...
- c# 类成员的定义 定义方法、字段和属性【转】
c# 类成员的定义 定义方法.字段和属性c#类的成员包括字段.属性和方法.所有成员都有自己的访问级别,用下面的关键字之一来定义:public----成员可以有任何代码访问:private----成员只 ...
- C++---类成员变量定义为引用
摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #i ...
随机推荐
- windows 上搭建gitblit
https://www.cnblogs.com/ucos/p/3924720.htmlhttps://www.cnblogs.com/sumuncle/p/6362697.htmlhttp://www ...
- Zookeeper —— 初识
什么是 Zookeeper Zookeeper 是一个开放源代码的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现: Zookeeper 是典型的分布式数据一致性的解决方案,分布 ...
- 【数据库】——SQLite使用drop column删除表字段
由于项目需求变更,我需要在sqlite的表中删除一个字段,通用的sql操作语句如下: alter table task drop column custom_fields; 结果数据库提示如下错误: ...
- Android深入源代码分析理解Aidl总体调用流程(雷惊风)
2017年開始上班的第一天.老不想工作了,假期感觉还没開始就已经结束了,唉,时间就是这样,新的一年開始了,尽管非常不想干正事,没办法,必须干起来.由于后边的路还非常长,距离六十岁还非常远. 刚上班也没 ...
- linq2db sqlite应用
使用linq2db sqlite 的时候,找不到增加,删除的操作,原来是要引入一个新的命名空间LinqTODB. 1 using LinqToDB; 插入: 1 User uNew = new Use ...
- 【MyBatis学习06】_parameter:解决There is no getter for property named in class java.lang.String
我们知道在mybatis的映射中传参数,只能传入一个.通过#{参数名} 即可获取传入的值. Mapper接口文件: public int delete(int id) throws Exception ...
- 【netcore基础】ConcurrentDictionary 使用字符串作为key给代码加锁且使用EF事物防止并发调用数据混乱的问题
业务场景需要锁住指定的字符串下的代码,防止并发创建多个订单 这里我们使用 ConcurrentDictionary 首先初始化一个字典 private static readonly Concurre ...
- 【netcore基础】ubuntu 16.04 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动
今天来整理下 netcore 在 linux(ubuntu) 上的运行环境搭建 对应版本 ubuntu 16.04 .net core 2.1 nginx version: nginx/1.10.3 ...
- js实现十分钟内在页面无任何操作,页面跳转至登陆页
// 如果10分钟没有操作,退出到登录页 var timer; function startTimer(){ clearTimeout(timer); timer=setTimeout(functio ...
- 谈一谈 MPU6050 姿态融合(转)
姿态角(Euler角)pitch yaw roll飞行器的姿态角并不是指哪个角度,是三个角度的统称.它们是:俯仰.滚转.偏航.你可以想象是飞机围绕XYZ三个轴分别转动形成的夹角. 地面坐标系(eart ...