C#gizli özellikleri? [kapalı]

ben bu soru aşağıdakileri öğrendikten sonra bu aklıma geldi:

where T : struct

biz, C# geliştiriciler, tüm C#temellerini biliyorum. Yani bildirimler, koşullar, döngüler, operatörler vb.

bazılarımız bile Jenerikler , anonim türleri , lambdas , LINQ gibi şeyler hakim ...

ama hatta C # hayranları, bağımlıları, uzmanlar zar zor biliyorum C # en gizli özellikleri veya hileler nelerdir?

şu ana kadar ortaya çıkan özellikler:



Anahtar Kelimeler

'

'

Dil Özellikleri

Visual Studio

Özellikleri

çerçeve

yöntemleri ve özellikleri

İpuçları Ve Püf Noktaları

diğer

1476
tarihinde sordu Serhat Ozgel 2008-08-12 20:32:24
kaynak

30 ответов

bu C # per se değil, ancak System.IO.Path.Combine() i gerçekten kullanması gereken ölçüde kullanan kimseyi görmedim. Aslında, tüm yol sınıfı gerçekten yararlıdır, ancak kimse bunu kullanmaz!

her üretim uygulamasının şu kodlara sahip olduğuna bahse girerim,

string path = dir + "\" + fileName;
752
cevap ageektrapped 2008-08-13 05:53:50
kaynak

lambdas ve tip inferrence derecelendirilmiştir. Lambdas birden fazla ifadeye sahip olabilir ve uyumlu bir temsilci nesnesi olarak çift otomatik olarak (sadece imza eşleşmesinden emin olun)

Console.CancelKeyPress +=
    (sender, e) => {
        Console.WriteLine("CTRL+C detected!\n");
        e.Cancel = true;
    };

bir new CancellationEventHandler olmadığımı ve sender ve e türlerini belirtmem gerektiğini unutmayın, olaydan etkilenmezler. Bu yüzden bu daha az hantal ayrıca parametrelerin türlerini belirtmek gerektirir bütün delegate (blah blah) yazmak için.

Lambdas'ın bir şey döndürmesi gerekmez ve tür çıkarımı bu bağlamda son derece güçlüdür.

ve BTW, her zaman Lambdas yapmak Lambdas fonksiyonel programlama anlamda dönebilirsiniz. Örneğin, bir düğmeyi işleyen bir lambda yapan bir lambda.Tıklayın olay:

Func<int, int, EventHandler> makeHandler =
    (dx, dy) => (sender, e) => {
        var btn = (Button) sender;
        btn.Top += dy;
        btn.Left += dx;
    };

btnUp.Click += makeHandler(0, -1);
btnDown.Click += makeHandler(0, 1);
btnLeft.Click += makeHandler(-1, 0);
btnRight.Click += makeHandler(1, 0);

zincirleme not: (dx, dy) => (sender, e) =>

şimdi bu yüzden işlevsel programlama sınıfını almaktan mutluluk duyuyorum: -)

C'deki işaretçiler dışında, öğrenmeniz gereken diğer temel şey olduğunu düşünüyorum: -)

585
cevap chakrit 2012-02-14 01:53:50
kaynak

Dan Rick Strahl :

sen zincir olabilir ?? operatör böylece null karşılaştırmalar bir demet yapabilirsiniz.

string result = value1 ?? value2 ?? value3 ?? String.Empty;
528
cevap jfs 2008-08-27 05:34:54
kaynak

Aliased jenerik:

using ASimpleName = Dictionary<string, Dictionary<string, List<string>>>;

Dictionary<string, Dictionary<string, List<string>>> yerine ASimpleName kullanmanıza izin verir .

, aynı genel büyük uzun karmaşık şeyi birçok yerde kullanacağınız zaman kullanın.

455
cevap BlackTigerX 2009-09-13 00:32:44
kaynak

From CLR via C# :

dizeleri normalleştirirken son derece kullanmanız önerilir Yerine ToUpperİnvariant ToLowerİnvariant çünkü Microsoft vardır gerçekleştirmek için kod optimize büyük harf karşılaştırmaları .

iş arkadaşımın karşılaştırmadan önce dizeleri her zaman büyük harfle değiştirdiğini hatırlıyorum. Bunu neden yaptığını hep merak ettim. çünkü önce küçük harfe dönüşmenin daha "doğal" olduğunu hissediyorum. Kitabı okuduktan sonra nedenini biliyorum.

438
cevap jfs 2008-08-15 15:06:48
kaynak

en sevdiğim numara, null coalesce operator ve parantezleri benim için otomatik olarak örneklemek için kullanıyor.

private IList<Foo> _foo;

public IList<Foo> ListOfFoo 
    { get { return _foo ?? (_foo = new List<Foo>()); } }
409
cevap Will 2010-03-21 20:14:24
kaynak

boş olay işleyicileri için kontrol kaçının

bildirimdeki olaylara boş bir temsilci ekleyerek, çağırmadan önce null için olayı her zaman kontrol etme ihtiyacını bastırır. Örnek:

public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!

bunu Yapmana izin ver

public void DoSomething()
{
    Click(this, "foo");
}

bunun yerine

public void DoSomething()
{
    // Unnecessary!
    MyClickHandler click = Click;
    if (click != null) // Unnecessary! 
    {
        click(this, "foo");
    }
}

ayrıca ilgili tartışma ve bu bakınız blog yazısı Eric Lippert tarafından bu konuda(ve olası downsides).

314
cevap andnil 2017-05-23 14:55:01
kaynak

her şey, artı

1) örtük jenerikler (neden sadece yöntemlerde ve sınıflarda değil?)

void GenericMethod<T>( T input ) { ... }

//Infer type, so
GenericMethod<int>(23); //You don't need the <>.
GenericMethod(23);      //Is enough.

2) bir parametreli basit lambdalar:

x => x.ToString() //simplify so many calls

3) anonim türleri ve başlatıcı:

//Duck-typed: works with any .Add method.
var colours = new Dictionary<string, string> {
    { "red", "#ff0000" },
    { "green", "#00ff00" },
    { "blue", "#0000ff" }
};

int[] arrayOfInt = { 1, 2, 3, 4, 5 };

Another one:

4) otomatik özellikler farklı kapsamlara sahip olabilir:

public int MyId { get; private set; }

hatırlatan için teşekkürler @pzycoman:

5) ad alanı takma adları (bu özel ayrıma ihtiyacınız olması muhtemel değildir):

using web = System.Web.UI.WebControls;
using win = System.Windows.Forms;

web::Control aWebControl = new web::Control();
win::Control aFormControl = new win::Control();
305
cevap Keith 2012-02-14 01:56:02
kaynak

bir süredir" as " anahtar kelimesini bilmiyordum.

MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

ikincisi eğer n benim Sınıfım değil, aksine sınıf dökme bir istisna daha boş dönecektir.

286
cevap Mike Stone 2008-08-12 20:42:04
kaynak

sevdiğim iki şey otomatik özelliklerdir, böylece kodunuzu daha da daraltabilirsiniz:

private string _name;
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

,

public string Name { get; set;}

ayrıca nesne başlatıcıları:

Employee emp = new Employee();
emp.Name = "John Smith";
emp.StartDate = DateTime.Now();

,

Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()}
262
cevap lomaxx 2008-08-13 11:39:13
kaynak

genel türlerdeki 'varsayılan'anahtar sözcüğü:

T t = default(T);

T bir başvuru türü ise bir' null ' sonuçlanır ve 0 ise bir int, false bir boolean ise, vesaire.

255
cevap Eric Minkes 2008-08-13 14:20:07
kaynak

genel olarak Nitelikler, ancak en önemlisi hata Ayıklayıcısıdisplay . Sana yıllar kazandırır.

226
cevap boj 2009-04-26 20:34:20
kaynak

@, derleyicinin herhangi birini görmezden gelmesini söyler bir dize karakterleri kaçış.

sadece bunu açıklığa kavuşturmak istedi... kaçış karakterlerini görmezden gelmesini söylemez, aslında derleyiciye dizeyi bir edebi olarak yorumlamasını söyler.

varsa

string s = @"cat
             dog
             fish"

aslında olarak basılacaktır (girinti için kullanılan beyaz alanı bile içerdiğini unutmayın):

cat
             dog
             fish
221
cevap lomaxx 2009-09-13 00:33:53
kaynak

C# (. net 3.5) ifade ağaçları , özellikle en az takdir ve daha az bilinen özelliklerinden biri olduğunu düşünüyorum Jenerikler ve Lambdas ile kombine edildiğinde. Bu, Nİnject ve Moq gibi yeni kütüphanelerin kullandığı API oluşturulmasına yönelik bir yaklaşımdır.

örneğin, bir API ile bir yöntem kaydetmek istediğimi ve API'NIN

yöntem adını alması gerektiğini varsayalım

verilen bu sınıf:

public class MyClass
{
     public void SomeMethod() { /* Do Something */ }
}

önce, geliştiricilerin bunu dizeleri ve türleri (veya dize tabanlı başka bir şey) ile yaptıklarını görmek çok yaygındı:

RegisterMethod(typeof(MyClass), "SomeMethod");

iyi, çünkü güçlü yazarak eksikliği berbat. Ya"SomeMethod" i yeniden adlandırırsam? Şimdi, 3.5'de, bunu güçlü bir şekilde yazılan bir şekilde yapabilirim:

RegisterMethod<MyClass>(cl => cl.SomeMethod());
RegisterMethod sınıfının Expression<Action<T>> kullandığı

şöyle:

void RegisterMethod<T>(Expression<Action<T>> action) where T : class
{
    var expression = (action.Body as MethodCallExpression);

    if (expression != null)
    {
        // TODO: Register method
        Console.WriteLine(expression.Method.Name);
    }
}

Bu, şu anda Lambdalara ve palmiye ağaçlarına aşık olmamın büyük bir nedeni.

220
cevap Jason Olson 2010-06-07 00:22:32
kaynak

" " " aklıma gelirdi. [DefaultValue()] gibi bazı nitelikler de Favorilerim arasındadır.

" var " anahtar sözcüğü biraz daha biliniyor, ancak. net 2.0 uygulamalarında da kullanabilirsiniz ( . net 3.5 derleyicisini kullanın ve çıktı 2.0 koduna ayarlayın) çok iyi bilinmiyor gibi görünüyor.

Düzenle: kokos, işaret ettiğin için sağ ol.? operatör, bu gerçekten çok yararlı. Bunun için Google'da biraz zor olduğu için (as ?? sadece göz ardı edilir), işte bu operatör için MSDN Dokümantasyon sayfası: ?? Operatör (C # Reference)

209
cevap Michael Stum 2011-05-23 15:18:11
kaynak

çoğu C # geliştiricisinin 'nullable' türlerini bilmediğini bulma eğilimindeyim. Temelde, ilkel bir null değeri olabilir.

double? num1 = null; 
double num2 = num1 ?? -100;

null çift, num1 , null, sonra normal bir çift, num2 , num1 veya -100 ise num1 null.

http://msdn.microsoft.com/en-us/library/1t3y8s4s (VS.80).aspx

Nullable türü hakkında bir şey daha:

DateTime? tmp = new DateTime();
tmp = null;
return tmp.ToString();

dönüş dizesidir.Boş. Daha fazla bilgi için bu bağlantısını kontrol edin

198
cevap Brad Barker 2017-05-23 13:31:39
kaynak

burada belgesiz C# anahtar kelimeler şeklinde bazı ilginç gizli C# özellikleri vardır:

__makeref

__reftype

__refvalue

__arglist

bunlar belgesiz C # anahtar kelimelerdir (hatta Visual Studio onları tanır!) jeneriklerden önce daha verimli bir boks/unboxing için eklenmiştir. Sistem ile koordinasyon içinde çalışırlar.TypedReference yapısı.

değişken uzunluk parametre listeleri için kullanılan _ _ arglist de var.

bir şey Millet sistemi hakkında çok şey bilmiyor.WeakReference - bir nesne izler ama yine de çöp toplayıcı toplamak için izin veren çok yararlı bir sınıf.

en yararlı "gizli" özelliği verim dönüş anahtar kelime olacaktır. Bu gerçekten gizli değil, ama bir sürü insan bunu bilmiyor. LINQ bunun üzerine inşa edilmiştir; kaputun altında bir devlet makinesi oluşturarak gecikme idam sorguları için izin verir. Raymond Chen son zamanlarda iç, cesur ayrıntılar .

193
cevap Judah Himango 2011-11-10 21:14:12
kaynak

'(C++ paylaşılan bellek türü) saf, güvenli C#

güvensiz mod ve işaretçiler başvurmadan, sınıf üyeleri bir sınıf/yapı bellek alanı paylaşmak olabilir. Aşağıdaki sınıf göz önüne alındığında:

[StructLayout(LayoutKind.Explicit)]
public class A
{
    [FieldOffset(0)]
    public byte One;

    [FieldOffset(1)]
    public byte Two;

    [FieldOffset(2)]
    public byte Three;

    [FieldOffset(3)]
    public byte Four;

    [FieldOffset(0)]
    public int Int32;
}

İnt32 alanını manipüle ederek bayt alanlarının değerlerini değiştirebilir ve tam tersi olabilir. Örneğin, bu program:

    static void Main(string[] args)
    {
        A a = new A { Int32 = int.MaxValue };

        Console.WriteLine(a.Int32);
        Console.WriteLine("{0:X} {1:X} {2:X} {3:X}", a.One, a.Two, a.Three, a.Four);

        a.Four = 0;
        a.Three = 0;
        Console.WriteLine(a.Int32);
    }

bunu çıkarır:

2147483647
FF FF FF 7F
65535

sadece Ekle Sistemi Kullanma.Çalışma.Interopservices;

185
cevap ZeroBugBounce 2008-09-24 00:39:01
kaynak

anahtar kelimeler olan değişken adları için @ kullanarak.

var @object = new object();
var @string = "";
var @if = IpsoFacto(); 
176
cevap Mark Cidade 2008-08-18 05:45:02
kaynak

herhangi bir arama blokları veya finalizers kullanmadan programınızdan çıkmak istiyorsanız FailFast kullanın:

Environment.FailFast()
168
cevap Jan Bannister 2009-12-19 06:06:41
kaynak

bir yöntemden anonim türleri dönen ve yansıma olmadan üyelere erişme.

// Useful? probably not.
private void foo()
{
    var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) });
    Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges);
}

object GetUserTuple()
{
    return new { Name = "dp", Badges = 5 };
}    

// Using the magic of Type Inference...
static T AnonCast<T>(object obj, T t)
{
   return (T) obj;
}
153
cevap denis phillips 2011-04-06 17:39:36
kaynak

işte düzenli ifadeler ve dosya yolları için yararlı bir tane:

"c:\program files\oldway"
@"c:\program file\newway"

@, derleyiciye bir dizedeki kaçış karakterlerini görmezden gelmesini söyler.

146
cevap Patrick 2008-08-12 23:01:09
kaynak

Mixins. Temel olarak, birkaç sınıfa bir özellik eklemek istiyorsanız, ancak hepsi için bir temel sınıf kullanamıyorsanız, her sınıfın bir arabirimi (Üye Olmadan) uygulamak için alın. Ardından, arabirimi için uzatma yöntemi yazın, yani

public static DeepCopy(this IPrototype p) { ... }

tabii ki, bazı netlik kurban edilir. Ama işe yarıyor!

142
cevap Dmitri Nesteruk 2011-04-22 23:36:43
kaynak

kimsenin neden Nullable kullanmak isteyeceğinden emin değilim. :- )

Doğru, Yanlış, FileNotFound ?

131
cevap Michael Stum 2008-11-22 10:39:07
kaynak

bu misnamed olduğu kadar "gizli" değil.

"harita", "azalt" ve "filtre" algoritmalarına çok dikkat edilir. Çoğu insanın fark etmediği şey,. net 3.5'in bu algoritmaların üçünü de eklemesidir, ancak LİNQ'UN bir parçası oldukları gerçeğine dayanarak onlara çok SQL-ish isimleri verdi.

" map " = > select

geçmiş verileri bir formdan başka bir

"reduce" = > agrega

agrega değerler tek bir sonuç

"filter" = > Where

Filters data temel bir kriter

yineleme ve koşullandırma almak için kullanılan koleksiyonlar üzerinde satır içi iş yapmak için LINQ kullanma yeteneği inanılmaz derecede değerli olabilir. Tüm LINQ uzatma yöntemlerinin kodunuzu daha kompakt ve sürdürülebilir hale getirmeye nasıl yardımcı olabileceğini öğrenmeye değer.

117
cevap Brad Wilson 2008-08-17 03:55:28
kaynak
Environment.NewLine

sistem bağımsız yeni hatları için.

115
cevap nt. 2009-09-27 23:25:06
kaynak

bir dize içinde kıvırcık parantez kullanmaya çalışıyorsanız.Biçim ifadesi...

int foo = 3;
string bar = "blind mice";
String.Format("{{I am in brackets!}} {0} {1}", foo, bar);
//Outputs "{I am in brackets!} 3 blind mice"
111
cevap Portman 2010-05-19 18:43:18
kaynak
  1. ?? - birleştirme operatörü
  2. kullanma ( deyimi / yönergesi ) - sadece
  3. çağırarak daha fazla kullanılabilir büyük anahtar kelime
  4. readonly -
  5. daha fazla kullanılmalıdır
  6. Netmodules-çok kötü Visual Studio'da
  7. desteği yok
104
cevap Doctor Jones 2010-04-30 14:31:14
kaynak

@ Ed, bunu nitpicking'den biraz daha fazla olduğu için gönderme konusunda biraz suskunum. Ancak, kod örneğinizde şunu belirtmek isterim:

MyClass c;
  if (obj is MyClass)
    c = obj as MyClass

' ıs ' kullanacaksanız, neden 'as' kullanarak güvenli bir döküm ile takip edin? Eğer obj gerçekten MyClass olduğunu tespit ettiyseniz, bir bataklık standart döküm:

c = (MyClass)obj

... asla başarısız olmayacak.

benzer şekilde,

diyebilirsiniz
MyClass c = obj as MyClass;
if(c != null)
{
   ...
}

emin olmak için. NET'İN iç organlarını yeterince bilmiyorum, ancak içgüdülerim bunun en fazla iki tür operasyonun en fazla birini keseceğini söylüyor. İşleme bankasını her iki şekilde de kırmak pek olası değildir; şahsen, bence ikinci form da daha temiz görünüyor.

103
cevap Dogmang 2008-08-12 22:03:12
kaynak

belki de gelişmiş bir teknik değil, ama beni delirten her zaman görüyorum:

if (x == 1)
{
   x = 2;
}
else
{
   x = 3;
}

için yoğunlaştırılabilir:

x = (x==1) ? 2 : 3;
98
cevap JasonS 2008-08-19 19:54:52
kaynak

Diğer sorular c# hidden-features