2013-09-28 49 views
5

Tôi mới sử dụng C#. Tôi đã thử điều này với tham số trong C#Tham số ngoài trong 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); 
    } 
} 

nhưng tôi nhận được một số lỗi như "Sử dụng unassigned ra tham số 'm'"
Tham số ra 'm' phải được giao cho trước kiểm soát lá phương pháp hiện tại.

Vì vậy, ý nghĩa của các lỗi này là gì và tại sao nó là bắt buộc để gán 'm' khi tôi đã được gán một giá trị cho x. Các thông số

+2

Bạn đang nhầm lẫn các tham số 'out' với tham số' ref'. 'fun()' không có quyền truy cập vào giá trị trước đó của bất kỳ 'm' nào trỏ vào, và do đó không thể nhân nó. Sự khác biệt này là cố ý, các tham số 'out' có nghĩa là cho phép bạn có nhiều giá trị trả lại. Nó giống như bạn đang cố tạo một hàm nhân giá trị của biến mà kết quả của nó được gán cho nó. – millimoose

Trả lời

12

ref có nghĩa là bạn đang đi qua một tham chiếu đến biến mà đã được tuyên bố và được khởi tạo, trước khi gọi phương thức và phương thức có thể sửa đổi giá trị của biến đó.

out có nghĩa là bạn đang đi qua một tham chiếu đến biến mà đã được công bố nhưng chưa khởi, trước khi gọi phương pháp này, và rằng phương pháp này phải khởi tạo hoặc thiết lập giá trị của nó trước khi trở về.

2

out là khi chức năng muốn chuyển giá trị ra của chính nó. Những gì bạn muốn ở đây là ref, đó là khi hàm mong đợi nó được truyền vào, nhưng có thể thay đổi nó.

Để biết ví dụ về cách cả hai được cho là được sử dụng, hãy đọc http://www.dotnetperls.com/parameter. Nó được giải thích một cách đơn giản, và bạn sẽ có thể hiểu rõ về nó.

Bạn nên lưu ý rằng trong mã của mình, bạn không bao giờ truy cập biến sau khi gọi hàm, do đó ref không thực sự làm bất cứ điều gì. Mục đích của nó là gửi các thay đổi về biến ban đầu.

2

Bạn đang nhận được và lỗi, bởi vì biến gửi đến phương pháp như tham số out không phải được khởi tạo trước khi gọi phương thức. Sau đây là 100% mã đúng:

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

Dường như bạn đang tìm kiếm ref thay vì out đây:

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

Kể từ C# 7.0 khả năng khai báo biến ngay tại điểm mà nó được truyền dưới dạng đối số ngoài đã được giới thiệu.

Trước:

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

Bạn thậm chí có thể sử dụng var chủ chốt từ:

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

Hãy cẩn thận với phạm vi của tham số ra.Ví dụ, trong đoạn mã sau, "i" chỉ được sử dụng trong vòng if-tuyên bố:

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

Thông tin bổ sung có thể được tìm thấy here. Liên kết này không chỉ về tham số ngoài số, nhưng tất cả các tính năng mới được giới thiệu trong C# 7.0

Các vấn đề liên quan