C#基础 基本语法4
1、除了基本的OOP技術,還要熟悉一些比較高級的技術。集合、比較、轉換。
System.Collections名稱空間中的幾個接口提供了基本的集合功能。
IEnumberable;ICollection;IList;IDictionnary
2、
ArrayList animalArrayList=new ArrayList();
------------------------------------------------------------------------------------------
第十章
1、
public:
private:成員只能由類中的代碼訪問。
internal:只能由定義它的項目內部代碼訪問。
protected:只能由類或派生類中的代碼訪問。//只能由項目中派生類的代碼來訪問。
2、.NET Framework中的公共字段以PascalCasing來命名,而不是camelCasing
定義字段
class MyClass
{
public int MyInt;
}
class MyClass
{
public readonly int MyInt=17;//只在執行構造函數的過程中賦值,或由初始化語句賦值
}
class MyClass
{
public static int MyInt;//可以用static關鍵字聲明為靜態;靜態字段必須通過定義它們的類來訪問,而不是通通過這個類的對象實例來訪問。const成員是靜態的,所以不需要用static修飾符。
}
3、定義方法
class MyClass
{
public string GetString()
{
return "Here is a string.";
}
如果使用了static關鍵字,這個方法就只能通過類來訪問。不能通過對象實例來訪問。
也可以在方法定義中使用
virtual:方法可以重寫
abstract:方法必須在非抽象的派生類中重寫(只用于抽象類中)
override:方法重寫了一個基類方法(如果方法重寫就必須使用該關鍵字)
extern:方法定義放在其他地方。
}
重寫::::::::
public class MyBaseClass
{
public virtual void DoSomething()
{
//Base implementation.
}
public class MyDerivedCalss:MyBaseClass
{
public override void DoSomething(){
//Derived class implementation,override base implementation.
}
//如果使用了override 也可以使用sealed指定在派生類中不能對這兒方法進一步修改
//public override sealed void DoSomething(){
// .......
//}
}
4、屬性擁有兩個類似于函數的快,一個快獲取屬性的值,另一個用于設置屬性的值。也稱為訪問器
分別用get、set關鍵字來定義。可以忽略其中一個塊來創建只讀或只寫屬性(忽略get塊創建只寫屬性,忽略set塊創建只讀屬性)
private int myInt;
public int MyIntProp//可以是public或private
{
get{return myInt;}//get字段必須有一個屬性類型的返回值,簡單的屬性一般與私有字段相關聯,以控制對這個字段的訪問,此時get塊可以直接返回該字段的值。
set{myInt =value;}//set以類似的方式把一個值賦值給字段。Value等于類型與屬性相同的類型,就不必擔心數據類型轉換了。
}
//這個簡單的屬性只能直接訪問myInt字段。在對操作進行更多的控制時,屬性的真正作用才發揮出來。
set
{
if(value>=0&&value<=10)//只有賦值屬性的值在0-10之間,才會改為myInt
myInt=value;
}
//如果使用了無效值1、什么也不錯2、給字段賦值默認值3、繼續執行4、拋出異常
set
{
if(value>=0&&value<=10)//只有賦值屬性的值在0-10之間,才會改為myInt
myInt=value;
else
throw(new ArgumentOutOfRangeException("MyIntProp",value,"MyIntProp must be assigned a value between 0 and 10."))
}
-------------------------------------------
private int MyInt;
public int MyIntProp{
get{return myInt;}
protected set{myInt =value;}//只有在類或派生類的代碼才能使用set訪問器。
}
5、自動屬性
public int MyIntProp{get;set;}//我們按照通常的方式定義屬性的可訪問性、類型和名稱,但沒有給get,set塊提供實現的代碼(和底層的字段)都由編譯器提供。自動屬性的唯一限制是它們必須包含get set存取器,無法使用這種方式定義只讀只寫屬性。
6、public class MyBaseClass
{
public void DoSomething()
{
//Base implementation;
}
}
public class MyDerivedClass:MyBaseClass
{
public void DoSomething()
{
//Derived class implementation,hides base implementation.
}
}
//這段代碼可以正常運行,但是會產生警告,說明隱藏了一個基類成員。如果無意間隱藏此時可以改正錯誤,如果確實要隱藏,要用new關鍵字顯示的表明意圖。
public class MybaseClass
{
public void DoSomething()
{
//Base implementation;
}
}
public class MyDerivedClass:MyBaseClass
{
new public void DoSomething()
{
//Derived class implementation,hides base implementation.
}
}
---------------------------注意隱藏基類成員和重寫他們的區別
public class MybaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base imp");
}
}
public class MyDerivedClass:MyBaseClass
{
public override void DoSomething()
{
Console.WriteLine("Derived imp");
}
}//重寫方法將替換基類中的實現代碼,這樣代碼將使用新版本,即使通過基類類型進行的,情況也是這樣的(使用多態性)
MyDerivedClass myObj=new MyDerivedClass();
MyBaseClass myBaseObj;
myBaseObj=myObj;
myBaseObj=DoSomething();//結果也是Deried imp
-----------------------------------------------使用下面代碼隱藏基類方法
public class MybaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base imp");
}
}
public class MyDerivedClass:MyBaseClass
{
new public void DoSomething()
{
Console.WriteLine("Derived imp");//基類方法不一定是虛擬的,結果為Base imp
}
}
7、調用重寫或隱藏的基類方法
無論是重寫成員還是隱藏成員,都可以在派生類的內部訪問基類成員。在許多情況下都很有用的。
1、要對 派生類的用戶隱藏繼承的公共成員,但仍能在類總訪問其功能
2、要給繼承的虛擬成員添加實現代碼,而不是簡單地用重寫的新執行的代碼替換它。
public class MybaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Base imp");
}
}
public class MyDerivedClass:MyBaseClass
{
public override void DoSomething()
{
base.DoSomething();
}
}
//MyBaseClass是MyDrerivedClass的基類,而DoSomething()版本包含在MyDrivedClass中,因為base使用的是對象實例,所以靜態成員中使用它會產生錯誤
8、this關鍵字最常用的事把當前對象實例的引用傳遞給一個方法
public void DoSomething()
{
MyTargetClass myObj=new MyTargetClass();
myobj=DoSomethingWith(this);
}
還有一個方法是限定本地類型成員。
public class MyClass
{
private int someData;
public int SomeData
{
get
{
return this.someData;//一眼就看出引用的是成員
}
}
}
9、接口-成員-的定義:
不允許使用訪問修飾符public,private,protected,internal所有的接口成員都是公共的。
接口成員不能包含代碼體
接口不能定義字段成員
接口成員不能用關鍵字static,virtual,abstract,sealed來定義
類型定義成員是禁止的。
-----------------------------------------------------------------------------------------
interface IMyBaseInterface
{
void DoSomething();
}
interface IMyDerivedInterface:IMyBaseInterface
{
new void DoSomething();
}//執行方式與隱藏繼承的類成員的方式一樣,接口中定義的屬性可以定義訪問塊get,set中的哪一個用于該屬性
10、interface IMyInterface
{
int MyInt{get;set;}//int屬性MyInt有get,set存取器對于訪問級別有更嚴格的限制來說,可以省略他們任何一個//類似自動屬性,但自動屬性是為類定義的,自動屬性必須包含get,set存取器
}
//接口沒有指定如何存儲屬性數據接口不能指定字段。接口與類一樣,可以定義為類的成員但不能定義為其他接口的成員,因為接口不包含類型定義。
11、類中實現接口
類中實現接口必須包含該接口所有成員的實現代碼,且必須匹配指定的簽名,包括匹配指定的get,set塊,并且必須是公共的。
public interface IMyInterface
{
void DoSomething();
void DoSomethingElse();
}
public class MyClass:IMInterface
{
public void DoSomething()
{
}
public void DoSomething()
{
}
}
------------------------------------------------------------------------------------
可以使用關鍵字virtual或abstract實現接口成員,但不能使用static或const。
//可以在基類上實現接口
public interface IMyInterface
{
void DoSomething();
void DoSomethingElse();
}
public class MyBaseClass()
{
public void DoSomething()
{
}
}
public class MyDerivedClass:MyBaseClass,IMyInterface
{
public void DoSomethingElse()
{
}
}
//P223
12、隱式的實現接口成員
MyClass myObj=new MyClass();
myObj.DoSomething();
或者
MyClass myObj=new MyClass();
IMyInterface myInt=myObj;
myInt.DoSomething();
顯示的實現接口成員
public class MyClass:IMyInterface
{
void IMyInerface.DoSomething()//DoSomething是顯示的實現
{
}
public void DoSomethingElse()//是隱式的實現,只有這個可以通過MyClass的對象實例來訪問
{
}
}
13、用非公共的可訪問性添加屬性存儲器
public interface IMyInterface
{
int MyIntProperty
{
get;
}
}
public class MyBaseClass:IMyInterface
{
public int MyIntProperty{get;protected set;}
}
14、部分類的定義//如果使用部分類定義,partial關鍵字就必須出現在包含在定義部分的每個文件的于此相同的位置。
public partial clss MyClass
{
............
}
------------------------------------------------------------------------
public partial class MyClass:IMyInterface1
{
......
}
public partial class MyClass:IMyInterface2
{
......
}
和public class Myclass:IMyInerface1,IMyInterface2
{
......
}//等價的
15、部分方法在部分類中定義,但沒有方法體,但在另一個部分類中包含實現代碼,這兩個類中都要使用pratial關鍵字。
public partial class Myclass
{
prrtial void MyPartialMethod();
}
public partial class MyClass
{
partial void MyPartialMethod()
{
//Method implementation
}
}
//部分方法也可以是靜態的,但他們總是私有的,且不能有返回值,他們使用的任何參數都不能是out參數,但可以是ref參數。部分方法也不能使用virtual,abstract,override,new,sealed,extern修飾符
部分方法編譯時重要,用法不重要。
public partial classMyClass
{
public void DoSomethingElse();
public void DoSomething()
{
Console.WriteLine("DoSomething() execution started.");
DoSomethingElse();
Console.WriteLine("DoSomething() exexution finished.");
}
}
public partical class MyClass
{
partial void DoSomethingElse()
{
Console.WriteLine("DoSomethingElse() calles.");
}
}//第一個部分類定義和調用部分方法DoSomethingElse,在第二個部分類中實現它,結果為
DoSomething() execution started.
DoSomething() called.
Dosomething() execution finished.
------------------------------------------------------------------------------------------
?
轉載于:https://www.cnblogs.com/d685600/p/3650365.html
總結
以上是生活随笔為你收集整理的C#基础 基本语法4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9年测试老鸟:Glenford J编写《
- 下一篇: [转] C#异步操作