2013-07-17 14 views
-1

我需要了解一些澄清:C#「爲」操作者和高級轉化使用在環路/功能和輸出/ ref參數調節劑和typeof運算()

是/隨着運營商

出/ ref參數改性劑

typeof

隨意只回復你知道的或你想回復的內容,如果你不喜歡的話,不要回答整個問題。

是的,我問這些澄清。糾正我或增加我已經說過的話。

嗯,我GOOGLE了一下,落在了各種網站上,MSDN等。我仍然需要一些人寫一些代碼來幫助我澄清整個概念,並最終讓我充分利用它,希望這對其他人也有幫助。

基本上這就是我理解的:

A)

在僞

如果對象是這種類型的返回true,否則假

容易。或者我在這裏做錯了什麼?

是否有任何限制或問題與某些類型的?

此代碼運行正常,所以我想我得到這個好。

object s = new SqlBoolean(); 
     if (s is SqlBoolean) 
     { 
      Console.WriteLine("Is SqlBoolean"); 
      Console.ReadLine(); 
     } 

2)

好了,我還是要充分了解這一點。

MSDN報告:

as運算符用於執行兼容 類型之間的轉換。 as運算符就像一個類型轉換,除了它在 轉換失敗而不是引發異常時產生空值。

嗯,我嘗試過的對象陣列上的循環,它基本上只轉換原語,並與不少問題(每鑄造比有點困難更拋出空或東西)

using System; 
using System.Data.SqlTypes; 

class StackOverflow 
{ 
    public static void Main() 
    { 
     string country = "jii"; 
     string vatNum= "dde"; 

     object[] MyObjects = {country, 
           vatNum 
          }; 

     for (int i = 0; i<=MyObjects.Length-1;i++) 
     { 
      MyObjects[i] = MyObjects[i] as SqlString?; 
      Console.WriteLine(MyObjects[i].ToString() + " " + MyObjects[i].GetType()); 
      Console.ReadLine(); 
     } 
    } 
} 

在我正在做的一個程序中,我需要將這些值轉換爲SqlStrings,SqlBooleans等。在事實上,我強迫的SqlString與線可空

注重「的SqlString?」問號在最後(?力可空,誰知道它!:D)。

所以基本上它是做不使用異常的一些低級別的轉換有用嗎?或者是什麼?

3)REF

嗯,基本上REF從函數內改變預聲明變量的值:

IE

using System; 

class StackOverflow 
{ 
    public static void Main() 
    { 
     int x = 10; 
     Write(func(ref x).ToString()); 
     Write(Convert.ToString(x)); 
    } 

    public static int func(ref int y) 
    { 
     y += 10; 
     return y; 
    } 

    public static void Write(string z) 
    { 

     Console.WriteLine(z); 
     Console.ReadLine(); 

    } 
} 

執行此將確定和輸出將是20 20 去除兩個參考將輸出20 10

(ref直接更改外部聲明的x,而沒有在方法中創建實例)

out of out?什麼用途????

我無法得到它。看起來它看起來就像是一個參數,它可以做同樣的ref,但它可以讓你以某種方式擁有一些輸出參數。

在前面顯示的代碼中代替ref只會導致IntelliSense出現編譯錯誤,我甚至不知道如何讓這些輸出參數顯示出來。

在一個項目中,我在做我使用下面的代碼:

public static Array check(string country, string vatNum) 
{ 
    bool valid; 
    string name; 
    string address; 
    checkVatService vatchecker = new checkVatService(); 
    vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address); 

    return new object[] {country, 
         vatNum, 
         valid, 
         name, 
         address 
         }; 
} 

現在,checkVat從european online checking webservice.

我看到它有out參數一些代碼,它們通過產生從web服務網站(link to library, if needed

的wsdl web服務使用庫如何使用out參數?他們是否有一些輸出沒有使用回報?我如何使用它們?請非常詳細

4)的typeof

這將返回從您傳遞給它的類型的System.Type類型。

首先我想我能得到我傳遞給它像

int x; 
SqlBoolean xy = new SqlBoolean(); 
typeof(x) // integer 
typeof(xy) // SqlBoolean 

任何對象的類型,但它不是。

它只是從System.Type返回類型。

的typeof(INT)的ToString()// System.Int32或類似的東西 的typeof(XY)的ToString()// System.Data.SqlTypes.SqlSqlBoolean

和我真的不知道該怎麼做。

爲了得到一個對象的類型,你必須做一些類似於.GetType的東西。

那麼typeof的實際用途是什麼,我錯過了什麼?

感謝任何人

+6

閱讀這些運營商的文檔將遠遠超過詢問他們#2更富有成效。 – Matthew

+0

代碼'MyObjects [i] = MyObjects [i] as SqlString?;'根本沒有任何意義。如果對象不是'SqlString',它會將值設置爲'null',但如果數組存在空對象...顯然,如果對象不是'SqlString',那麼您將擁有一個下一行訪問衝突。如果你曾經試過你的代碼,你會發現它不起作用,它應該給你提示你的代碼是無效的,你應該閱讀官方的MSDN文檔。 – Phil1970

回答

-1

這是真正的答案後,我得到了自己的概念和ref。

參考 - >如果您之前在您調用的方法之外初始化一個變量並且希望該方法向其分配結果值,那麼您會傳遞一個參數作爲參考。

手續 - >你傳遞一個PARAM作爲輸出,當你調用可能會或可能不會被分配方法之外的變量,你想要的方法來assing它的結果值

原樣>難道一個沒有投拋出異常。

此外,this

2

大問題..小回答:

  1. 正確的。
  2. 它允許演員失敗,沒有例外。因此,您可以檢查結果是否爲null。如果是,演員失敗。
  3. ref通過引用傳遞對象(注意:儘管仍然是按值傳遞的語義!)。 out表示在函數退出之前必須先分配一個變量。
  4. 我不確定我是否瞭解與typeof有關的問題。如果你不明白爲什麼它可能有用,那麼最好不要理會它的使用(就像真的一樣)。
1

1)你是正確的關於爲運營商
2)使用的是運營商的是,它抑制錯案的例外,這樣當投錯了,它拋出空。 3)關於ref請參考下面的鏈接,這裏給出詳細的解釋Why use the 'ref' keyword when passing an object?
4)out參數通常用於你需要從一個函數中返回多個值的情況。一個值是使用return語句直接返回的,其他值是使用out參數返回的。例如,清楚的理解,請參閱what is use of out parameter in c#。你可以在那裏找到傑恩斯威特的優秀文章。
5)有可能會出現您要查看的對象的類型進行ceratain操作的情況,但主要是這不應該根據RTTI設計原則

1
1

的typeof的GetType都不同,可以輸出不同的結果。 Refer to this SO post因爲存在我見過的最簡單的解釋。


ref和out

默認情況下,方法的參數是通過,這意味着傳遞給方法時,參數的值被複制通過。如果您有foo(int y){y = 9;} main(){int x = 5; Foo(x);},則方法Foo將x的值複製到y,然後爲y賦予一個不同的值。 x仍然保持爲5.如果您有引用類型參數(例如Foo(object y){y = null;} main(){object x = new object(); Foo(x);}),則y包含複製值x,該​​值是引用值而不是對象本身。因此,對y所做的更改也不反映在x中。相比之下,ref和out是引用傳遞:

// Example of ref: 
// p DOES NOT copy x's reference value of the object 
// p is x (or refer to the same memory as x) 

class Ref_Example 
{ 
    static void Foo(ref int p) { p = 8}; 
    static void Main() { 
     int x = 5; Foo(ref x); 
     Console.WriteLine(x); // output: 8 
    } 
} 

// Example of out: 
// out = ref, except variables need not be assigned before method is called 
// You use out when you have to return multiple values from a function 
Class Out_Example 
{ 
    static void Find_Synonyms(
      string vocab, out string synonymA, out string synonymB) 
    { // Lookup the synonyms of the word "rich" }; 

    static void Main() 
    { 
     string a, b; 
     Find_Synonyms("rich", a, b); 
     Console.WriteLine(a); // abundant 
     Console.WriteLine(b); // affluent 
} 

當然你也可以打破什麼REF /出專爲,並通過指定變量的初始值利用裁判來代替出來的,但它沒有邏輯意義,可能會使代碼閱讀器感到困惑。 (即你怎麼知道的同義詞你做了搜索之前你爲什麼要賦予它一個不正確的初始值等?)



進一步指出:

INT = System.Int32SqlBoolean = System.Data.SqlTypes.SqlBoolean。 int只是可能歸因於傳統的別名,而System.Int32是C#類型的完整表示/名稱。什麼公開int x方法如x.Equals,x.ToStringx.Parse? System.Int32。在C#中,類型是具有定義數據或引用類型的成員的類(例如System.Int32)。