SORU
5 Temmuz 2011, Salı


C# operatör aşırı yükleme için " ="?

Operatör aşırı yükleme yapmaya çalışıyorum " = " veremem ama. Sadece bir operatör aşırı yükleme yapabilirim " ".

Nasıl yani?

Edit

Bu çalışmıyor neden bir Vektör sınıfı (X ve Y bir alan ile). Aşağıdaki örneği ele alalım.

vector1  = vector2;

Eğer operatör benim aşırı ayarlanır:

public static Vector operator  (Vector left, Vector right)
{
    return new Vector(right.x   left.x, right.y   left.y);
}

Sonuç vector1, ama bunun yerine, vector1 başvurusu ile yepyeni bir Vektör olacak da eklenmeyecek.

CEVAP
5 Temmuz 2011, Salı


Overloadable Operators Web sitesini ziyaret:

Atama operatörleri olamaz aşırı yüklenmiş ama =, örneğin, fazla yüklenmiş olabilir kullanılarak değerlendirilir.

Daha atama operatörleri hiçbiri aşırı yüklenmiş olabilir. Bu Çöp toplama ve CLR güçlü yazılı dünyasında potansiyel bir güvenlik deliği olan bellek yönetimi için bir etkisi olacak, çünkü bu olduğunu düşünüyorum.

Yine de, bir operatör olduğunu görelim. Ünlü göre Jeffrey Richter's book Her bir programlama dili özel bir yöntemi çağırır derlenmiş olan kendi operatörleri kendi listesi vardır, ve CLR operatörleri hakkında bir şey biliyor kendisi değil. Hadi tam olarak = operatörlerin gerisinde kalıyor?

Bu basit bir kod

Decimal d = 10M;
d = d   10M;
Console.WriteLine(d);

Bakalım bu talimatlar için IL-kod görünümü:

  IL_0000:  nop
  IL_0001:  ldc.i4.s   10
  IL_0003:  newobj     instance void [mscorlib]System.Decimal::.ctor(int32)
  IL_0008:  stloc.0
  IL_0009:  ldloc.0
  IL_000a:  ldc.i4.s   10
  IL_000c:  newobj     instance void [mscorlib]System.Decimal::.ctor(int32)
  IL_0011:  call       valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Addition(valuetype [mscorlib]System.Decimal,
                                                                                                valuetype [mscorlib]System.Decimal)
  IL_0016:  stloc.0

Şimdi bu kodu görelim:

Decimal d1 = 10M;
d1  = 10M;
Console.WriteLine(d1);

Ve IL-kod bu

  IL_0000:  nop
  IL_0001:  ldc.i4.s   10
  IL_0003:  newobj     instance void [mscorlib]System.Decimal::.ctor(int32)
  IL_0008:  stloc.0
  IL_0009:  ldloc.0
  IL_000a:  ldc.i4.s   10
  IL_000c:  newobj     instance void [mscorlib]System.Decimal::.ctor(int32)
  IL_0011:  call       valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Addition(valuetype [mscorlib]System.Decimal,
                                                                                                valuetype [mscorlib]System.Decimal)
  IL_0016:  stloc.0

Eşit! = operatör sadece program için sözdizimsel şekerC# operatör aşırı yükleme , ve olabilir sadece.

Örneğin:

class Foo
{
    private int c1;

    public Foo(int c11)
    {
        c1 = c11;
    }

    public static Foo operator  (Foo c1, Foo x)
    {
        return new Foo(c1.c1   x.c1);
    }
}

static void Main(string[] args)
{
    Foo d1 =  new Foo (10);
    Foo d2 = new Foo(11);
    d2  = d1;
}

Bu kod derlenecek ve başarılı olarak çalışacak:

  IL_0000:  nop
  IL_0001:  ldc.i4.s   10
  IL_0003:  newobj     instance void ConsoleApplication2.Program/Foo::.ctor(int32)
  IL_0008:  stloc.0
  IL_0009:  ldc.i4.s   11
  IL_000b:  newobj     instance void ConsoleApplication2.Program/Foo::.ctor(int32)
  IL_0010:  stloc.1
  IL_0011:  ldloc.1
  IL_0012:  ldloc.0
  IL_0013:  call       class ConsoleApplication2.Program/Foo ConsoleApplication2.Program/Foo::op_Addition(class ConsoleApplication2.Program/Foo,
                                                                                                          class ConsoleApplication2.Program/Foo)
  IL_0018:  stloc.1

Güncelleme:

Senin güncellemesine göre - @EricLippert dediği gibi, gerçekten değişmez bir nesne olarak vektörler olmalıdır. Sonuç iki vektörün eklemekyenivektör, farklı boyutları ile ilk değil.

Nedense ilk vektör değiştirmek istiyorsanız, bu aşırı (bana gelince, bu çok garip davranışlar) kullanabilirsiniz

public static Vector operator  (Vector left, Vector right)
{
    left.x  = right.x;
    left.y  = right.y;
    return left;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • apenney888

    apenney888

    27 EKİM 2010
  • guillaume2111's channel

    guillaume211

    19 Kasım 2006
  • Top Gear

    Top Gear

    27 Mart 2006