天天看點

C#基礎知識系列一(goto、i++、三元運算符、ref和out、String和string、重載運算符)

前言

  這兩天在網上看到的總結很多,尤其是部落格園中的,很多很多,也給了我很多的啟發,當然自己也總結過,而且有很多人也給與我一些意見和看法。不管怎樣,自己還是先把所謂的基礎知識加強鞏固下吧。

  2014年的第一篇部落格,希望自己從基礎開始。也是希望自己能夠稍微系統來學習整合一下。因為之前從來都沒系統學習過,都是用到啥查啥,先查啥就忘啥快,是以在此記錄一下,以備以後檢視。好了廢話也不多說,進入正題。 

正文

1、類和對象

  類的定義:具有相同屬性和功能的對象的抽象的集合。——腦門一閃,類其實也是個集合嗎?

  類的執行個體:執行個體化就是建立對象的過程,使用new關鍵字來建立。

  來看以下代碼,最簡單的,你肯定懂:

public class Cat
    {
        public string Name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
        }
    }      

就是這句:Cat cat=new Cat();其實它做了兩件事情,不知道你們知道不,我是現在才又知道的(原來肯定知道過,不過早已抛在千裡之外了):

2、goto:語句将程式控制直接傳遞給标記語句。

  goto貌似在開發中從來沒用過。

static void Main(string[] args)
        {
            int i = 0;
        repeat:            // the label
            Console.WriteLine("i: {0}", i);
            i++;
            if (i < 10)
                goto repeat;  // the dastardly deed

            Console.ReadLine();
        }      

這是一個簡單的用法滿足條件的時候,跳轉到标記repeat;

輸出結果:

C#基礎知識系列一(goto、i++、三元運算符、ref和out、String和string、重載運算符)

這有一篇關于goto的詳細介紹:包括它的優缺點,應用場景。

http://www.cnblogs.com/IT-Bear/archive/2012/03/05/2380389.html

3、continue、break、return:C#程式設計文法中我們會經常碰到break ,continue, return這三個常用的關鍵字

break語句會使運作的程式立刻退出包含在最内層的循環或者退出一個switch語句。由于它是用來退出循環或者switch語句,是以隻有當它出現在這些語句時,這種形式的break語句才是合法的。

如果一個循環的終止條件非常複雜,那麼使用break語句來實作某些條件比用一個循環表達式來表達所有的條件容易得多。

for (var i = 1; i <= 10; i++)
            {
                if (i == 6) break;
                Console.WriteLine(i);
            } //輸出結果:12345      

continue語句和break語句相似。所不同的是,它不是退出一個循環,而是開始循環的一次新疊代。

continue語句隻能用在while語句、do/while語句、for語句、或者for/in語句的循環體内,在其它地方使用都會引起錯誤!

for (var i = 1; i <= 10; i++)
            {
                if (i == 6) continue;
                Console.WriteLine(i);
            }
            //輸出結果:1234578910      

return語句就是用于指定函數傳回的值。return語句隻能出現在函數體内,出現在代碼中的其他任何地方都會造成文法錯誤!

當執行return語句時,即使函數主體中還有其他語句,函數執行也會停止!

4、i++和++i,前者先用後加,後者先加後用

這個在學校學的時候就感覺好别扭,現在好久沒看了又模糊了。可能這也是面試的時候很多公司願意出的問題吧。

static void Main(string[] args)
        {
            int valueOne = 10;
            int valueTwo;
            valueTwo = valueOne++;
            Console.WriteLine("After postfix: {0}, {1}", valueOne,
            valueTwo);
            valueOne = 20;
            valueTwo = ++valueOne;
            Console.WriteLine("After prefix: {0}, {1}", valueOne,
            valueTwo);
            Console.ReadLine();
        }      
C#基礎知識系列一(goto、i++、三元運算符、ref和out、String和string、重載運算符)

再來看一個簡單的小例子:

int k = 0;
            int i = 3;
            k = ++i + (i++);
            Console.WriteLine("k={0},i={1}", k, i);      

先來看如果i=3; return i++; 那麼傳回的是3;如果return ++i;那麼傳回的是4。

是以 ++i 現在i=4;表達式變為4+(4++),而4++是先用了再加 是以就是8++,而8++同理先傳回8,i再++,i就為5。

C#基礎知識系列一(goto、i++、三元運算符、ref和out、String和string、重載運算符)

當然此題解法可能不止一種,如果你有興趣可以一起來探讨一下。

5、switch中的case可以這樣寫

static void Main(string[] args)
        {
            const int Democrat = 0;
            const int LiberalRepublican = 1;
            const int Republican = 2;

            int myChoice = LiberalRepublican;

            switch (myChoice)
            {
                case Democrat:
                    Console.WriteLine("You voted Democratic.\n");
                    break;
                case LiberalRepublican:
                case Republican:
                    Console.WriteLine("You voted Republican.\n");
                    break;
                default:
                    Console.WriteLine("You did not pick a valid choice.\n");
                    break;
            }
            Console.ReadLine();
        }      

case LiberalRepublican:

case Republican:

符合這兩個條件都會執行:

Console.WriteLine("You voted Republican.\n");      

6、三元運算符相當于if  else

static void Main( string[] args )
      {
         int valueOne = 10;
         int valueTwo = 20;
         int maxValue = valueOne > valueTwo ? valueOne : valueTwo;

         Console.WriteLine( "ValueOne: {0}, valueTwo: {1}, maxValue: {2}",
             valueOne, valueTwo, maxValue );
      }      
C#基礎知識系列一(goto、i++、三元運算符、ref和out、String和string、重載運算符)
int maxValue = valueOne > valueTwo ? valueOne : valueTwo;      

這一句等同于一個if else

if (valueOne > valueTwo)
         {
             maxValue = valueOne;
         }
         else
         {
             maxValue = valueTwo;
         }      

7、ref和out:兩者都是按位址傳遞的,使用後都将改變原來參數的數值

rel可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,參數的數值為空,是以你必須初始化一次。這個就是兩個的差別,或者說就像有的網友說的,rel是有進有出,out是隻出不進。

先來看一下ref:其效果是,當控制權傳遞回調用方法時,在方法中對參數的任何更改都将反映在該變量中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。

示例:

static void Method(ref int i)
        {
            i = 44;
        }

        static void Main(string[] args)
        {
            int val = 0;
            Method(ref val);
            Console.WriteLine(val);              // val is now 44
            Console.ReadLine();
        }      

傳遞到 ref 參數的參數必須最先初始化。這與 out 不同,後者的參數在傳遞之前不需要顯式初始化。

再來看一下out:out 關鍵字會導緻參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在于 ref 要求變量必須在傳遞之前進行初始化。若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。

static void Method(out int i)
        {
            i = 44;
        }

        static void Main(string[] args)
        {
            int val;
            Method(out val);
            Console.WriteLine(val);              // val is now 44
            Console.ReadLine();
        }      

盡管作為 out 參數傳遞的變量不必在傳遞之前進行初始化,但需要調用方法以便在方法傳回之前指派。

ref 和 out 關鍵字在運作時的處理方式不同,但在編譯時的處理方式相同。是以,如果一個方法采用 ref 參數,而另一個方法采用 out 參數,則無法重載這兩個方法。例如,從編譯的角度來看,以下代碼中的兩個方法是完全相同的,是以将不會編譯以下代碼:

C#基礎知識系列一(goto、i++、三元運算符、ref和out、String和string、重載運算符)

但是,如果一個方法采用 ref 或 out 參數,而另一個方法不采用這兩類參數,則可以進行重載,如下所示:

public void SampleMethod( int i) { }

        public void SampleMethod(ref int i) { }      

這樣兩個方法編譯是可以成功的。

 8、String和string,之前幾乎沒區分過這兩個,不過還是要注意一下。

在C#中,string 是 System.String 的别名,是以基本上在使用時是沒有差别的。習慣上,我們把字元串當作對象時(有值的對象實體),我們用string。

而我們把它當類時(需要字元串類中定義的方法),我們用String,比如:string greet = String.Format("Hello {0}!", place)。

其實亂用也可以,隻是這樣概念上清楚一點。

另外string是C#保留字,不可用作變量名,String就不是了。 String 必須先引用 System命名空間。

也可以這樣了解:string是C#中字元串類型String的反射,一種簡化的書寫方式,就像int對應于Int32一樣,二者在C#中可通用。

再則String是一個類,string是一種資料類型。string是c#中的類,String是.net Framework的類(在c# IDE中不會顯示藍色)

c# string映射為.net Framework的String。如果用string,編譯器會把它編譯成String,是以如果直接用String就可以讓編譯器少做一點點工作。

9、重載運算符 

 先來看幾行簡單的代碼:

static void Main(string[] args)
        {
             int x = 5;
             int y = 6;
             int sum = x + y;
             Console.WriteLine(sum);
            Console.ReadLine();
        }      

一個int  sum=x+y; 加法運算。

稍微封裝一下:

static void Main(string[] args)
        {
            int x = 5;
            int y = 6;
            int sum = Add(x, y);
            Console.WriteLine(sum);
        }
        static int Add(int x, int y)
        {
            return x + y;
        }      

如果現在有一個類,需要得知兩個類某個屬性的和,我們可能會這樣:

public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person("aehyok", 25);
            Person p2 = new Person("Leo", 24);
            int sum = Add(p1.Age, p2.Age);
            Console.WriteLine(sum);
        }
        static int Add(int x, int y)
        {
            return x + y;
        }
    }      

我們再來改動一下:

class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person("aehyok", 25);
            Person p2 = new Person("Leo", 24);
            int sum = p1 + p2;
            Console.WriteLine(sum);
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }

        public static int operator +(Person p1,Person p2)
        {
            return p1.Age+p2.Age;
        }
    }      

總結

   感覺自己的基礎有點一塌糊塗吧,好好的補一下。這樣一看原來很多基礎的東西我從來都不清楚,或者見過然後忘記了。自己在此好好的進行整理總結一下,主要是為了自己複習鞏固吧,也希望對某些人有一點作用,當然我的整理中可能存在很多問題,歡迎大牛們來指正。

繼續閱讀