DotNetの知識-30

  1. インターフェースの使用に注意してください。

インターフェイスは、メンバーのアクセス修飾子を追加することはできません。

インターフェイスのメンバーは任意の実装を持つことができません

実装は、インターフェイスは、インターフェイスのすべてのメンバーを実装する必要がありますそのサブクラス

クラスは、クラスを継承し、複数のインターフェイスを実装することができながら、サブクラスは親クラスの継承する場合は、Aを、そして器具インタフェースIA 、次いで、文法Aは、で書かれなければならないIAのクラスは、単一継承であるため、正面、及びインターフェースを実現し、より多くのことができます

インタフェースを実装する際に考慮すべき問題は、明示的および暗黙的インタフェース(我々は通常暗黙の実現)を実装します

クラスがインタフェースを実装し、インタフェースはメソッドで明示的に実装されますが、ノートすることができます:明示的方法でインタフェースを実装した後、この方法は、唯一のインタフェース変数呼び出すことができます

IFlyableフライ=新しい鳥();

fly.Fly(); // 正しいです

 

バード)(=新しい鳥を飛びます。

fly.Fly(); // エラー

 

 

アップキャスト

シングル責任原則(このように定義さ回避のかさばるインタフェースは、「インターフェイスの汚染」、インターフェイスに関連付けられたメンバーのグループの定義のみを引き起こす可能性があります)

2 、抽象クラスとインタフェースとの間の差:

同じポイント:

抽象クラスとインタフェースをインスタンス化することはできません

違い:

抽象基底クラス、フィールド、プロパティ、メソッドを定義します。インタフェースは専用のプロパティ、インデクサ、イベント、およびメソッドを定義することができます

抽象クラスは、さらに洗練する必要が完了していないクラスで、インターフェイスは仕様の動作です。マイクロソフトは常にカスタムインタフェース綱できる場、それが表現の一種であることを証明、「私にできること......」

複数のインターフェースを実現することができる、それは単一の抽象クラスを継承することができ

より多くの抽象クラスは密接に関連するクラス、クラス関係とインタフェースが緩んでいるが、すべてのほとんどは内の特定の機能を実現するための一連の間で定義されます

抽象クラスは、関連するオブジェクトの一連の概念から抽象化するため、内部共通のものを反映している、機能インタフェース合意定義された外部呼び出しを満たすために、このようなものの外部特性を反映します

インタフェースのいずれかの特定の特性は基本的に継承されていません、それはメソッド呼び出しのみを約束することができます

インターフェイスは、コールバックをサポートするために使用することができますが、この機能を継承する必要はありません。

具体的な方法抽象クラスが実装デフォルトでは、仮想ですが、インタフェースクラスインタフェースメソッドの実装が、デフォルトでは非空で、もちろん、あなたも仮想として宣言することができます

抽象クラスは、インターフェイスを実装している場合、抽象クラスインターフェースのサブクラスのメソッドが達成しながら、インターフェースは、実装しなくても、抽象メソッドとして抽象クラスメソッドにマッピングすることができ

      3.  型変換

 

コンバージョンカテゴリ

コードをコピー

// 暗黙的な変換

int型NUM = 1;

文字列STR = num.toString()。

 

 

 

// キャスト

int型、A = 5;

(ダブル)B =。

コードをコピー

変換条件

ToStringメソッド()メソッド

これは、あるオブジェクトの仮想メソッドのオブジェクトは、このメソッド自体をオーバーライドすることができます。あなたは戻り値の型の名前をオーバーライドしない場合

解析()TryParse()メソッド

同じ点:値のタイプについては、文字列に変換されます。

違い:

戻り値は同じではない:解析()変換される戻り値の型であり、TryParse()成功した変換かどうかを返すブール

パース()変換が例外をスローします失敗したが、TryParse()変換が返すために失敗した偽の例外をスローしないであろう、

Parse()直接传入要转换的类型的值,而TryParse()需要一个out输出参数输出转换的结果

       4.静态成员

 

加载时机(什么时候加载静态成员?)

在该静态成员第一次被调用的时候加载

适用情形(什么时候用静态成员)

在整个程序内部共享的数据才定义为静态的。通常被作为工具类使用。比如DBSqlHelper

在普通类和静态类中的区别

静态类需要用static,静态类不能被实例化

静态类中只能包含静态成员

在实例方法中可以直接调用静态成员,但在静态方法中不能直接调用实例方法

静态类和静态变量创建后始终使用同一块内存,而使用实例的方法会创建多个内存空间

静态构造函数不能有参数,也不能与访问修饰符(默认是private

      5.静态类的继承

 

从子类的角度:静态类不能被任何类继承

从父类的角度:静态类只能继承Object类,不能继承其他类

      6.类和成员的访问修饰符

 

类的默认访问修饰符是internal

类的成员的默认访问修饰符是private

类的访问修饰符只有两种:publicinternal(默认)

类的成员的访问修饰符有:publicprotectedprivate(默认)

      7.结构

 

本质是值类型

值类型和引用类型的选择

值类型:主要是用来封装一组数据,并为数据提供一种简单的处理方式

引用类型:

主要用来封装数据和行为

使用面向对象的特征

当类型中的成员比较多的时候用结构(存在堆里)

new关键字的作用

在使用new关键字创建对象后,所有的成员变量都已经存在,并有默认值(值类型)

如果没有用new关键字,则需要程序员手动为所有的用到了的成员变量赋值,之后才能调用结构对象里的方法属性

结构不new也可以使用,但是必须给使用的结构成员赋值才能使用

      8.类和结构的区别

 

结构是值类型,是分配在内存的栈上的,而类是引用类型,是分配在内存的堆上的

结构不能被继承,因为结构是值类型,隐式继承自System.ValueType

结构是是值传递的(赋值传递),而类是引用传递的

      9.访问级别的约束

 

子类的访问级别不能比父类高

方法参数的访问级别   >=   方法的访问级别(比如当方法的参数传递的是一个类的对象时,那么此时这个类对象的访问级别要高于当前方法的访问级别)

      10.析构函数

 

一个类只能有一个析构函数

无法继承或重载析构函数

无法手动去调用析构函数,因为它是被GC(垃圾回收机制)自动调用的

析构函数不能有访问修饰符,也不能有参数

不能在结构体中定义析构函数,因为结构是值类型,而值类型是存储在栈中,栈中的数据用完之后就立即销毁了,而析构函数的目的就是用来释放资源的,一般存储在堆中的引用类型才需要GC去释放,而因结构体中不能定义析构函数,所以只能对类使用析构函数

复制代码

//析构函数语法

 

class MyDispose

{

      ~MyDisPose()

    {

          ……//释放资源的代码

    }

}

复制代码

 

 

 

 

      11.字符串

 

属性:length

静态方法

常用:

LastIndexOf:用来查找某个字符或字符串,在一个特定字符串对象里的下标

SubString 截取

Split() 根据特定字符来分割字符串,并返回分割后的字符串的数组,可以用foreach读取

Join静态方法

Format() 静态方法

Replace(),替换完要接收,产生一个新的字符串

Replace().Replace()链式编程

Trim()去首尾空格

      12.“==”运算符好 “Equals()”方法的区别

 

“==”比较时:

如果比较是值类型,则比较两个对象的值

如果比较的是引用类型,则比较两个对象的引用地址是否相同(比较堆地址)

“Equals()”比较时:

此方法是Object类里的一个虚方法,默认就是用的“==”及进行比较,是对“==”进行的一个封装,但是,大部分MicroSoft的类及用户自定义的类,都重写了该虚方法,也就是MicroSoft和用户各自为自己编写的Object的子类定义了相等比较规则

     注意:这里有一个特例,因为string是一个引用类型,所以按理说string.Equals("……")方法比较的是地址,而这里比较的是字符串的值

 

      13.字符串的恒定性:

 

    当字符串在内存中已经被创建后,程序员再次创建相同值的字符串对象时,CLR做了优化,直接把第一个字符串的引用赋给了第二个变量,也就是说,前后两个字符串变脸保存了相同的字符串对象应用

 

      14.StringBuilder对象

 

    String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不 会 。 所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder , 不要使用 String。如果要操作一个不断增长的字符串,尽量不用 String , 改用 StringBuilder 类。

 

    两个类的工作原理不同 :String 类是一种传统的修改字符串的方式 , 它确实可以完成把一个字符串添加到另一个字符串上的工作没错 , 但是在 .NET 框架下 , 这个操作实在是划不来 。 因为系统先是把两个字符串写入内存 , 接着删除原来的 String 对象 , 然后创建一个 String 对象 , 并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用 System.Text 命名空间下面的StringBuilder 类就不是这样了,它提供的 Append 方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然 , 一般情况下觉察不到这二者效率的差异 , 但如果你要对某个字符串进行大量的添加操作,那么 StringBuilder 类所耗费的时间和 String 类简直不是一个数量级的。

おすすめ

転載: www.cnblogs.com/Mr-Prince/p/12104465.html