程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#語法比擬其它說話比擬奇特的處所(三)

C#語法比擬其它說話比擬奇特的處所(三)

編輯:C#入門知識

C#語法比擬其它說話比擬奇特的處所(三)。本站提示廣大學習愛好者:(C#語法比擬其它說話比擬奇特的處所(三))文章只能為提供參考,不一定能成為您想要的結果。以下是C#語法比擬其它說話比擬奇特的處所(三)正文


1.在C++中許可從一個case貫串到另外一個case標簽
好比:

int a =1;
switch(a)
{
  case 1:
     some statements;
  case 2;
     other statements;
     break;
}

第一個case和第二個case之間可以沒有break
而在C#中這個break不克不及省略.
3.as和is只會檢測待轉化類型的類型,而不會停止其它操作,所以只要當轉化類型是目的類型或許目的類型的子類(固然假如目的類型是接口,而且待轉化類型完成了該接口也能夠)能力轉換勝利.
強迫轉化,會挪用體系界說(好比float轉化為int類型)或本身界說的轉化函數(經由過程implicit operator界說).

從慣例的需求來看,年夜部門情形下,推舉應用as轉換.

但要留意as不克不及用於value type.由於在轉換不勝利的時刻前往null,而value type不克不及為
null.這時候可以斟酌用is.

object o = 1;
int i = 0;
if(o is int)
i = (int)o;

6.const是編譯經常量
readonly是運轉經常量
推舉應用static readonly取代const
const變量被硬編碼進assembly,有版本成績.
C#只是用sealed替換了fianl,別的C#的派生類在默許情形下不會override基類辦法,只要當基類辦法用症結字virtual標記,而且子類顯式用override標記辦法時才會override.如許也有用地處理了版本成績.
7.delegate在實質上就是函數指針.

由於拜托還激發了sun和MS的論爭.
Anders早在Borland的時刻就在Delphi中引入了delegate,後來跑到MS,弄J#的時刻又添加進了delegate,Sun很不滿足,說他們損壞了Java說話的特征.
到了C#,Anders終究可以理直氣壯地添加delegate了.


-------------------------------

狗尾續貂(二)

1.internal protected取的是internal和protected的並集,即在統一個Assembly或許分歧
的Assembly內然則繼續自該類都可以拜訪.

3..NET FrameWork采取了字符串緩沖池技巧.
好比 string a = "test";和string b = "test";a和b指向內存中的統一塊區域.
別的C#中有幾種判等方法,能否重寫可參照以下規矩:

public static bool ReferenceEquals( object left, object right );
public static bool Equals ( object left, object right );
public virtual bool Equals( object right);
public static bool operator==( MyClass left, MyClass right );

上述四個辦法override應當遵守以下規矩:

1.前兩個不管若何不要override
2.第三個和第四個在自界說類型是ValueType的時刻要改寫
3.當自界說類型是ReferenceType的時刻,假如想轉變RefrenceType默許的用對象標記判等的方法,可以改寫第三個

4.當自界說類型是RefrenceType的時刻,最好不要改寫operator==.

上面分離給出上述規矩的緣由:

1.

A.ReferenceEquals()這個辦法當且僅當兩個變量指向統一對象的時刻才相等,它的完成是比擬對象標記(Object Identity,任何對象在創立的時刻都邑生成一個OI),所以任何值類型用ReferenceEquals()比擬所獲得的成果都是false,即便跟本身比擬也是,由於要裝箱,裝箱的成果確定不是統一個對象.所以這個辦法也就沒有改寫的需要.object的ReferenceEquals()是完成這類比擬最好的方法.

B.Equals (object left, object right )這個辦法用於在不曉得待比擬的參數是何品種型的時刻.那若何比擬兩個變量能否相等那?很簡略,把比擬相等的職責交給個中一個待比擬變量的Equals辦法,上述辦法的完成年夜概以下所述:

public static bool Equals( object left, object right )
{
  // Check object identity
  if (left == right )
    return true;
  // both null references handled above
  if ((left == null) || (right == null))
    return false;
  return left.Equals (right);
}

之所以不要重寫上述兩個辦法,是由於二者都很好的完成了各自的語意.

2.為何是值的時刻要重寫第三個辦法?

ValueType是一切值類型的基類,因為要完成值相等的語意,它重寫了object的Equals辦法,然則在不曉得派生類變量和其類型的情形下,ValueType的Equals在完成的時刻只能用反射來比擬,如許的效力是很低的,所以任何自界說的值類型都要重寫Equals,以免用ValueType的默許完成帶來的反射的效力喪失.

3.object的實例Equals辦法的默許完成跟ReferenceEqual一樣,是經由過程比擬對象標記來完成的,有些ReferenceType須要值相等的語意,好比string,這是就要改寫實例Equals.

4..Net FrameWork希冀一切的ReferenceType的operator==保存援用語意.

相等在語意上必需知足三點

1.自反       a=a必需永久成立;
2.對稱       a=b則b=a;
3.傳遞       a=b;b=c則a=c

public class Foo
{
  public override bool Equals( object right )
  {
    //1.斷定待比擬變量援用能否為空
    if (right == null)
      return false;
 //2.能否指向統一實例,假如是統一實例則必定相等.
    if (object.ReferenceEquals( this, right ))
      return true;

    //3. 斷定類型能否雷同
    if (this.GetType() != right.GetType())
      return false;

    // 4.比擬內容
    return CompareFooMembers(
      this, right as Foo );
  }
}

第三步假如可以轉化成this援用的對象不可嗎?

謎底是不可,必需是類型雷同的.舉例以下:

public class B
{
  public override bool Equals( object right )
  {
    // check null:
    if (right == null)
      return false;

    // Check reference equality:
    if (object.ReferenceEquals( this, right ))
      return true;

    // Problems here, discussed below.
    B rightAsB = right as B;
    if (rightAsB == null)
      return false;

    return CompareBMembers( this, rightAsB );
  }
}

public class D : B
{
  // etc.
  public override bool Equals( object right )
  {
    // check null:
    if (right == null)
      return false;

    if (object.ReferenceEquals( this, right ))
      return true;

    // Problems here.
    D rightAsD = right as D;
    if (rightAsD == null)
      return false;

    if (base.Equals( rightAsD ) == false)
      return false;

    return CompareDMembers( this, rightAsD );
  }

}

//Test:
B baseObject = new B();
D derivedObject = new D();

// Comparison 1.
if (baseObject.Equals(derivedObject))
  Console.WriteLine( "Equals" );
else
  Console.WriteLine( "Not Equal" );

// Comparison 2.
if (derivedObject.Equals(baseObject))
  Console.WriteLine( "Equals" );
else
  Console.WriteLine( "Not Equal" );

留心一下加粗的部門就曉得,假如B的CompareBMembers和D的CompareDMembers比擬的元素相等的話,Comparison 1將輸入Equals,而Comparison 2將永久輸入Not Equal.所以在這類情形下將違背相等語意中的對稱性.
所以照樣老誠實其實第三步Check類型哈.
下面例子中D比B多了一句:

if (base.Equals( rightAsD ) == false)
      return false;

很顯著,基類的元素確定要讓基類去斷定能否相等.然則假如某個類的直接基類是object萬萬需要挪用base.Equals了,要否則跟沒有重寫實例Equals是一樣的後果

4.跟C++的援用紛歧樣,ref和out其實就是指針,在函數之間傳遞用的是拷貝傳值.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved