2008-11-05 41 views
21

Tôi muốn chuyển kiểu tham chiếu theo giá trị cho một phương thức trong C#. Có cách nào để làm điều đó.Chuyển các loại tham chiếu theo giá trị trong C#

Trong C++, tôi luôn có thể dựa vào trình tạo bản sao để phát nếu tôi muốn chuyển qua Giá trị. Có cách nào trong C# ngoại trừ: 1. Tạo một đối tượng mới một cách rõ ràng 2. Thực hiện IClonable và sau đó gọi phương thức Clone.

Dưới đây là một ví dụ nhỏ:

Hãy tham gia lớp A bằng C++ triển khai trình tạo bản sao.

Một phương pháp Func1 (Lớp a), tôi có thể gọi nó bằng cách nói Func1 (objA) (Tự động tạo ra một bản sao)

Liệu bất cứ điều gì tồn tại tương tự như trong C#. Nhân tiện, tôi đang sử dụng Visual Studio 2005.

Trả lời

8

Như đã giải thích, không có tương đương với các nhà xây dựng bản sao của C++.

Kỹ thuật khác là sử dụng thiết kế nơi các đối tượng không thay đổi. Đối với các đối tượng bất biến, không có sự khác biệt (ngữ nghĩa) giữa việc truyền tham chiếu và bản sao. Đây là cách System.String được thiết kế. Các hệ thống khác (đặc biệt là các ngôn ngữ chức năng) áp dụng kỹ thuật này nhiều hơn nữa.

19

Không, không có bản sao tương đương với hàm tạo nào trong C#. Nội dung bạn đang chuyển (theo giá trị) là tham chiếu .

ICloneable cũng là rủi ro, vì nó được xác định kém cho dù đó là sâu so với nông (cộng với nó không được hỗ trợ rất tốt). Một lựa chọn khác là sử dụng serialization, nhưng một lần nữa, có thể nhanh chóng rút ra nhiều dữ liệu hơn bạn dự định.

Nếu lo ngại là bạn không muốn phương pháp thực hiện thay đổi, bạn có thể xem xét việc biến lớp thành bất biến. Sau đó, không ai có thể làm bất cứ điều gì khó chịu với nó.

0

hãy nhìn vào this

public class Product 
{ 
    public string Name; 
    public string Color; 
    public string Category; 

    public Product(Product o) 
    { 
     this.Name=o.Name; 
     this.Color=o.Color; 
     this.Category=o.Category; 
    } 
    // Note we need to give a default constructor when override it 

    public Product() 
    { 
    } 
} 
public Product Produce(Product sample) 
{ 
    Product p=new Product(sample); 
    p.Category="Finished Product"; 
    return p; 
} 
Product sample=new Product(); 
sample.Name="Toy"; 
sample.Color="Red"; 
sample.Category="Sample Product"; 
Product p=Produce(sample); 
Console.WriteLine(String.Format("Product: Name={0}, Color={1}, Category={2}", p.Name, p.Color, p.Category)); 
Console.WriteLine(String.Format("Sample: Name={0}, Color={1}, Category={2}", sample.Name, sample.Color, sample.Category)); 
1

Theo liên kết này (đã đăng): http://msdn.microsoft.com/en-us/library/s6938f28(VS.80).aspx

Đi qua một loại tài liệu tham khảo theo giá trị được hiển thị bên dưới. arr kiểu tham chiếu được truyền theo giá trị cho phương thức thay đổi.

Mọi thay đổi sẽ ảnh hưởng đến mục gốc trừ khi mảng được gán vị trí bộ nhớ mới trong trường hợp đó, thay đổi hoàn toàn cục bộ đối với phương thức.

class PassingRefByVal 
{ 
    static void Change(int[] pArray) 
    { 
     pArray[0] = 888; // This change affects the original element. 
     pArray = new int[5] {-3, -1, -2, -3, -4}; // This change is local. 
     System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]); 
    } 

    static void Main() 
    { 
     int[] arr = {1, 4, 5}; 
     System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]); 

     Change(arr); 
     System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]); 
    } 
} 

Cuối cùng, đối với một sâu hơn trong cuộc thảo luận, xem bài của Jon Skeet trong câu hỏi này:

Passing Objects By Reference or Value in C#

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