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;

輸出結果:

這有一篇關於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();
        }

 

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

            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。

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

 

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 );
      }

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 參數,則無法重載這兩個方法。例如,從編譯的角度來看,以下代碼中的兩個方法是完全相同的,因此將不會編譯以下代碼:

但是,如果一個方法采用 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;
        }
    }

總結

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM