簡體   English   中英

C#中的屬性是通過引用傳遞的嗎?

[英]Are properties passed by reference in C#?

如果我有一些接受布爾值的方法,並且我向它傳遞了一個布爾值屬性,那么該方法會引用該屬性嗎? 或者只是我當時通過的價值?

您需要使用ref關鍵字在 C# 中按引用傳遞。 在 C# 中,按值傳遞是默認設置。 當您傳遞非不可變類實例時,這有點令人困惑,因為您傳遞的是引用的值。 當您將類引用傳遞給方法時,如果沒有ref關鍵字,該方法可以更改實例的屬性,但它們不能更改調用者對該實例的引用 他們無法更改調用者的引用以引用新實例。 但是使用ref (或out ),他們可以。

C# 中的ref關鍵字不能與屬性一起使用。 請參閱下面的代碼小提琴

編譯錯誤(第 8 行,第 15 列):屬性、索引器或動態成員訪問不能作為 out 或 ref 參數傳遞

C#

using System;

public class Program
{
    public static void Main()
    {
        var c = new C();
        F(ref c.P);
    }

    public static void F(ref int n) { }

    public class C
    {
        public int P { get; set; }
    }
}

這是因為ref int是對ref int的引用,並且具有 getter 和 setter 的屬性不是整數。 它是返回一個整數的代碼,或者可以為其分配一個整數。 C# 有一些魔法,但沒有那么多魔法。 而“魔法”只是編譯器生成的代碼。 他們本來可以這樣做的。 但他們沒有。

他們想將它作為指針(或任何與它非常相似的東西)上的簡單語法糖,以提高運行時效率。 但這種猜測可能大錯特錯。

你當時通過的東西的價值

它將傳遞值。

默認情況下,C# 中的所有參數都會復制該值。 例外情況是,當屬性使用outref注釋時,在這種情況下,參數實際上是對值的引用,而不是值本身。

雖然通常可以將參數通過引用傳遞給方法,但不能通過引用傳遞屬性的值,C# 根本不支持它。 如果您使用的方法使用ref進行了注釋,那么您的代碼將無法編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM