筆記 C#1-2-參數那些事兒

看書筆記


啃書中,英文不好於是怒啃原文書,看C#的目的是為了學習物件導向的精神,努力ING

給值 Definite Assignment

  • 區域變數必需在他們被讀取前就先明確給值
  • Function在呼叫他的時後,就必需提供給他參數,除非這個參數是非必要的
  • 所有變數在runtime時會被自動初始化

在下面這個例子中因寪x還沒被給值,於是會出現編譯錯誤

static void Main()
{
    int x;
    Console.WriteLine (x); // Compile-time error
}

Fields及 array 元素在下面的例子中,自動給予了int的初始化數字為0,所以不會有編譯錯誤

static void Main()
{
    int[] ints = new int[2];
    Console.WriteLine (ints[0]); // 0
}

這個例子中,因為x,有了預設值0
所以也不錯出錯

補充1:

//我們不能這樣用,static fields 只能被static function 呼叫,所以會出現錯誤

class lala{
     static int i;
     int k;
     function iam(){
        i = 1;
     }// error
}

但這樣可以

class lala{
     static int i;
     int k;
     function iam(){
        k = 1;
     }// ok 
}

以及這樣

class lala{
     static int i;
     int k;
     static function iam(){
        i = 1;
     } // 也是一個 static function 所以ok
} 

補充2:常數的用法const float pi = 3.14159,constants與static經常是定義上的差別

預設值

Type Default value 通常就是他們的型別,在記憶體表中,歸零時的意義

  • All reference types \ null
  • All numeric and enum types \ 0
  • chartype \ '\0'
  • booltype \ false

你可以使用default來取得他的預設置

decimal d = default (decimal)

參量

參量定義了這個方法有多少必需提供的參數,在下面的例子中 Foo方法,有一個參數叫p,他的type是int

static void Foo (int p)
{
p = p + 1; // Increment p by 1
Console.WriteLine(p); // Write p to screen
}
static void Main() { Foo (8); }

你可以用relout 來定義

  • (None) Value / Going in
  • ref Reference / Going in
  • out Reference / Going out

傳遞參數是by Value

預設上參數在C#是call by vale,這代表會創造一個新的綵件,並且將值拷貝給他

class Test
{
    static void Foo (int p)
    {
        p = p + 1; // Increment p by 1
     Console.WriteLine (p); // Write p to screen
     Variables and Parameters | 41
        C# Basics
    }
    static void Main()
    {
        int x = 8;
        Foo (x); // Make a copy of x
     Console.WriteLine (x); // x will still be 8
 }
}

在上面的例子中,將P改變了,並不會改寫到X,而且他們是在兩個獨立的記憶體位置

同樣的,如果你傳遞的參數是reference-type,他則是拷貝他的reference(地址),而不是物件

所以在下面的例子中,fOOSBsb皆指向了StringBuilder實例化後的物件,所以都被改變了

參數設定 ref 的設定

你可以利用 ref 來強指定所有的值都是用reference的方式

在下面的例子中改變P使用呼叫Foo方法後,X也成為了9

class Test
{
    static void Foo (refint p)
    {
        p = p + 1; // Increment p by 1
     Console.WriteLine (p); // Write p to screen
 }
    static void Main()
    {
        int x = 8;
        Foo (refx); // Ask Foo to deal directly with x
     Console.WriteLine (x); // x is now 9
     42 | Chapter 2:C# Language Basics
    }
}

如果你要實作一個交換的方法,這個設定就會非常重要,不然交換完你也取不到交換後的值

class Test
{
    static void Swap (ref string a, ref string b)
    {
        string temp = a;
        a = b;
        b = temp;
    }
    static void Main()
    {
        string x = "Penn";
        string y = "Teller";
        Swap (ref x, ref y);
        Console.WriteLine (x); // Teller
     Console.WriteLine (y); // Penn
 }
}

所有的參數都可以被改成用ref的方式傳送,就算他本身也是一個 reference type

參數設定 out 設定

大至上,out的意義就像rel除了幾點

  • 在進入Function前,不要給值
  • 但在出去前一定要給值

out最常被使用在用來回傳多個值的方法

例如:

class Test
{
    
  static void Split (string name, out string firstNames,out string lastName)
  {
    int i = name.LastIndexOf (' ');
    firstNames = name.Substring (0, i);
    lastName = name.Substring (i + 1);
  }
  static void Main()
  {
    string a, b;
    Split ("Stevie Ray Vaughan", out a, out b);
    Console.WriteLine (a); // Stevie Ray
    Console.WriteLine (b); // Vaughan
  }
}
comments powered by Disqus