2013-09-28 79 views
5

我是C#的新手。我在C#c#中的輸出參數#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
class First 
{ 
    public void fun(out int m) 
    { 
     m *= 10; 
     Console.WriteLine("value of m = " + m); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     First f = new First(); 
     int x = 30; 
     f.fun(out x); 
    } 
} 

與輸出參數試過,但我得到「使用未分配的輸出參數‘M’的」
的輸出參數「M」必須分配到之前的一些錯誤控制離開當前的方法。

那麼,什麼是這些錯誤的意義,爲什麼它是強制分配「」當我已經指定了價值X

+2

你混淆'和'ref'參數out'參數。 'fun()'不能訪問任何'm'指向的前一個值,因此不能乘以它。這種區別是有意的,'out'參數意味着讓你有多個返回值。就好像您正在嘗試創建一個函數,該函數將其結果分配給的變量的值相乘。 – millimoose

回答

12

ref意味着你傳遞引用已聲明變量並初始化爲,然後調用該方法,並且該方法可以修改該變量的值。

out意味着要傳遞到已宣告但尚未初始化,調用該方法前的變量的引用,並且該方法必須初始化或設置它的值,然後返回。

2

out參數用於函數想要傳遞值本身。你想要的是ref,這是函數期望它被傳入,但可以改變它。

有關兩者應如何使用的示例,請參閱http://www.dotnetperls.com/parameter。這是簡單的解釋,你應該能夠很好地理解它。

您應該注意,在您的代碼中,函數調用後永遠不會訪問該變量,因此ref實際上不會執行任何操作。其目的是將更改發回原始變量。

2

你會得到和錯誤,因爲變量發送到方法爲out參數不必在方法調用之前進行初始化。以下是100%正確的代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     First f = new First(); 
     int x; 
     f.fun(out x); 
    } 
} 

看起來你正在尋找的ref代替out這裏:

class First 
{ 
    public void fun(ref int m) 
    { 
     m *= 10; 
     Console.WriteLine("value of m = " + m); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     First f = new First(); 
     int x = 30; 
     f.fun(ref x); 
    } 
} 
1
public void Ref_Test(ref int x) 
{ 
    var y = x; // ok 
    x = 10; 
} 

// x is treated as an unitialized variable 
public void Out_Test(out int x) 
{ 
    var y = x; // not ok (will not compile) 
} 

public void Out_Test2(out int x) 
{ 
    x = 10; 
    var y = x; // ok because x is initialized in the line above 
} 
0

作爲C#7.0在其中作爲out參數引入它被傳遞點聲明變量權的能力。

前:

public void PrintCoordinates(Point p) 
{ 
    int x, y; // have to "predeclare" 
    p.GetCoordinates(out x, out y); 
    WriteLine($"({x}, {y})"); 
} 

C#7.0

public void PrintCoordinates(Point p) 
{ 
    p.GetCoordinates(out int x, out int y); 
    WriteLine($"({x}, {y})"); 
} 

你甚至可以使用VAR關鍵字:

p.GetCoordinates(out var x, out var y); 

要當心與輸出參數的範圍。例如,在下面的代碼,「i」 的僅內使用if語句

public void PrintStars(string s) 
{ 
    if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); } 
    else { WriteLine("Cloudy - no stars tonight!"); } 
} 

的進一步信息可以發現here。這個環節不僅是out參數,但所有的新功能介紹了C#7.0