SORU
14 HAZİRAN 2011, Salı


't C neden# başvurular iade desteği?

Okudum .NET başvuruları geri destekler, ama C# değil. Özel bir nedeni var mı? Neden böyle bir şey yapamam:

static ref int Max(ref int x, ref int y) 
{ 
  if (x > y) 
    return ref x; 
  else 
    return ref y; 
} 

CEVAP
14 HAZİRAN 2011, Salı


GÜNCELLEME: Bu soru my blog on June 23rd 2011 konu oldu. Harika soru için teşekkür ederiz!


Haklısınız; .NET desteklemiyoryöntem bu dönüşdeğişkenler için yönetilen başvuruyor. .NET de destekleryerel değişkenlerdiğer değişkenler için yönetilen başvurular içerir. (Ancak unutmayın .NET desteklemiyoralanlaryadizilero aşırı çöp toplama hikaye karıştırdığı için diğer değişkenler için yönetilen başvurular içerir. Ayrıca "değişken başardı başvuru" türleridirnesneye dönüştürülebilirve genel tür veya yöntem tür bağımsız değişkenleri olarak kullanılamaz, bu nedenle.)

Yorumcu "RPM1984" nedense bu gerçeği bir atıf istedi. RPM1984 sana CLİ şartname Bölüm I Bölüm 8.2.1.1, "Yönetilen işaretçiler ve" bu özellik hakkında daha fazla bilgi için .ilgili tip okumaya teşvik NET.

Tamamen Olası C bir sürümünü oluşturmak için# hem de bu özellikleri destekler. O zaman gibi şeyler yapabilirsin

static ref int Max(ref int x, ref int y) 
{ 
  if (x > y) 
    return ref x; 
  else 
    return ref y; 
} 

ve sonra onu aramak

int a = 123;
int b = 456; 
ref int c = ref Max(ref a, ref b); 
c  = 100;
Console.WriteLine(b); // 556!

C sürümü oluşturmak için mümkün olduğunu deneysel olarak biliyorum# bu özellikleri desteklerböyle bir şey yapmadım çünkü. Gelişmiş programcılar, özellikle insan taşıma yönetilmeyen C kod, sık sık sormak bizim için daha fazla C -gibi yapmak için yeteneği şeylerle başvurular olmadan sahip çık büyük çekiç aslında bağlantılarını kullanarak işaretçiler ve bellek çok dağınık. Yönetilen kaynaklar kullanarak çöp toplama performansı berbat bedeli ödemeden bu faydaları olsun.

Bu özelliği ele aldık, ve aslında yeterince diğer iç takımlar için onların geri bildirim almak için göstermek için uygulanmaktadır. Şu anda bizim araştırmaya dayalı ancaközellik veya kullanım durumlarda gerçek desteklenen bir dil özelliği haline itiraz zorlayıcı yeterince geniş olmadığını düşünüyoruz. Öncelikler ve zaman ve çaba sınırlı bir miktar daha var, bu özellik yakın bir zamanda yapacağız.

Ayrıca, bunu yaparken düzgün CLR bazı değişiklikler gerektirecektir. Şu anda CLR ref döndüren bir yöntem olarak değerlendiriryasalamadoğrulanamazbu durumu tespit eden bir Dedektör yok çünkü

ref int M1(ref int x)
{
    return ref x;
}

ref int M2()
{
    int y = 123;
    return ref M1(ref y); // Trouble!
}

int M3()
{
    ref int z = ref M2();
    return z;
}

M3 döner M2 yerel değişken içeriğini, ama bu değişkenin ömrü sona erdi! Mümkün ref-döndüren açıkça bunu kullanır belirleyen bir Dedektör yazmak içindeğilgüvenliği ihlal yığını. Ne yaparsınız böyle bir Dedektör yazmak ve eğer Dedektör güvenlik yığını olabilecek değilse, o zaman programın bu bölümünde ilan no döndürür kullanımına izin vermedi. Bunu yapmak için dev çalışmak çok büyük bir miktar değil, ama test takımları gerçekten tüm davalar var emin olmak için yükü çok fazla. Şu anda yararların maliyetlerden fazla olmayan bir noktaya özelliğini maliyetini arttıran başka bir şey.

Eğer bu özellik isteyen neden bana tarif edersen, ben gerçekten takdir ediyorum. Daha fazla bilgi istiyorlar neden gerçek müşteriler var, daha büyük olasılıkla bu üründe bir gün olacak. Sevimli küçük bir özellik ve eğer yeterli ilgi varsa müşteriler için bir şekilde almak mümkün olmak istiyorum.

(Ayrıca ilgili sorular Is it Possible to Return a Reference to a Variable in C#? Can I use a reference inside a C# function like C ?)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Defence Videos

    Defence Vide

    13 Mayıs 2013
  • The CGBros

    The CGBros

    20 AĞUSTOS 2011
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011