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# 定义类成员的更多相关文章

  1. 使用prototype 对象定义类成员

    使用prototype 对象定义类成员上一节介绍了类的实现机制以及构造函数的实现,现在介绍另一种为类添加成员的机制:prototype 对象.当new 一个function 时,该对象的成员将自动赋给 ...

  2. C#定义类成员

    1.成员定义 public--成员可以由任何代码访问. private--成员只能由类中的代码访问(如果没有使用任何关键字,就默认使用这个关键字). internal--成员只能由定义它的程序集(项目 ...

  3. java类成员的默认可访问性是什么?你猜

    先看下面TestModel: import org.apache.commons.collections4.BidiMap; import org.apache.commons.collections ...

  4. PHP中如何定义类及其成员属性与操作

    1.类的定义: i. 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ 成员属性........ 操    ...

  5. Kotlin入门(13)类成员的众生相

    上一篇文章介绍了类的简单定义及其构造方式,当时为了方便观察演示结果,在示例代码的构造函数中直接调用toast提示方法,但实际开发是不能这么干的.合理的做法是外部访问类的成员属性或者成员方法,从而获得处 ...

  6. PHP如何定义类及其成员属性与操作

    1.类的定义: 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ //成员属性 $name     =  ' ...

  7. c++模板类成员的声明和定义

    c++模板类成员的声明和定义应该都放在*.h中,有普通类不一样. 如果定义放在*.cpp中,最终链接时,会报方法undefined错误. 参考:http://users.cis.fiu.edu/~we ...

  8. c# 类成员的定义 定义方法、字段和属性【转】

    c# 类成员的定义 定义方法.字段和属性c#类的成员包括字段.属性和方法.所有成员都有自己的访问级别,用下面的关键字之一来定义:public----成员可以有任何代码访问:private----成员只 ...

  9. C++---类成员变量定义为引用

    摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #i ...

随机推荐

  1. SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域[转]

    SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域 原文地址:https://www.cnblogs.com/fanshuyao/p/716847 ...

  2. go语言fallthrough的用法心得

    fallthrough:Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面 ...

  3. docker容器里设置中文时区

    本文讨论docker容器里中文时区的问题,总所周知docker hub上的镜像默认都是英文时区的,在国人使用过程当中需要将时区设置成中文,我原来光配置/etc/localtime了date显示的时间也 ...

  4. java使用代理发post请求

    这东西啊,本身是无用的,但是要是移植就有用. package util; import java.util.Properties; public class HttpProxyConfiger { p ...

  5. ASP.NET Web Forms - 网站导航(Sitemap 文件)

    [参考]ASP.NET Web Forms - 导航 ASP.NET 带有内建的导航控件. 网站导航 维护大型网站的菜单是困难而且费时的. 在 ASP.NET 中,菜单可存储在文件中,这样易于维护.文 ...

  6. Mock an function to modify partial return value by special arguments on Python

    Mock an function to modify partial return value by special arguments on Python python mock一个带参数的方法,修 ...

  7. monit检测语法

    1.存在性检测 功能:检测文件或者服务不存在时进行相应的动作,默认是重启 语法: IF [DOES] NOT EXIST [[<X>] <Y> CYCLES]    THEN ...

  8. Android学习:AlertDialog对话框

    AlertDialog可以生成各种内容的对话框,它生成的对话框包含4个区域:图标区,标题区,内容区,按钮区 <?xml version="1.0" encoding=&quo ...

  9. ASP.NET MVC+BUI实现表格的操作

    在Web中基于表格的操作,比如添加行.单元格内容编辑等等功能,是完全基于js实现的.但如果程序员完全使用js或者jquery去编写表格控件,则会导致样式不统一,代码量较大等问题,尤其对于不太熟悉js的 ...

  10. I - All X

    F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据. 每组测试数据占一行,包含四个数字x,m,k ...