Pertanyaan Fitur Tersembunyi C #? [Tutup]


Ini muncul di benak saya setelah saya belajar hal berikut dari pertanyaan ini:

where T : struct

Kami, pengembang C #, semua tahu dasar-dasar C #. Maksud saya deklarasi, conditional, loop, operator, dll.

Beberapa dari kita bahkan menguasai hal-hal seperti itu Generik, tipe anonim, lambdas, LINQ, ...

Tapi apa fitur atau trik C # yang paling tersembunyi yang bahkan penggemar C #, pecandu, ahli hampir tidak tahu?

Berikut adalah fitur yang terungkap sejauh ini:


Kata kunci

Atribut

Sintaksis

Fitur Bahasa

Fitur Visual Studio

Kerangka

Metode dan Properti

  • String.IsNullOrEmpty() metode oleh KiwiBastard
  • List.ForEach() metode oleh KiwiBastard
  • BeginInvoke(), EndInvoke() metode oleh Will Dean
  • Nullable<T>.HasValue dan Nullable<T>.Value properti oleh Rismo
  • GetValueOrDefault metode oleh John Sheehan

Tips dan Trik

  • Metode bagus untuk penangan acara oleh Andreas H.R. Nilsson
  • Perbandingan huruf besar dengan John
  • Akses jenis anonim tanpa refleksi oleh dp
  • Cara cepat untuk membuat instantiate properti koleksi dengan malas Akan
  • Inline-fungsi anonim JavaScript-seperti oleh roosteronacid

Lain


1476


asal


Jawaban:


Ini bukan C # per se, tapi saya belum melihat siapa pun yang benar-benar menggunakan System.IO.Path.Combine() sejauh yang seharusnya. Bahkan, seluruh kelas Path benar-benar bermanfaat, tetapi tidak ada yang menggunakannya!

Saya berani bertaruh bahwa setiap aplikasi produksi memiliki kode berikut, meskipun seharusnya tidak:

string path = dir + "\\" + fileName;

752



lambdas dan jenis inferrence diremehkan. Lambdas dapat memiliki beberapa pernyataan dan mereka ganda sebagai objek delegasi yang kompatibel secara otomatis (pastikan saja tanda tangan cocok) seperti pada:

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

Perhatikan bahwa saya tidak punya new CancellationEventHandler saya juga tidak harus menentukan jenis sender dan e, mereka kalah dari acara tersebut. Itulah mengapa ini kurang rumit untuk menulis keseluruhan delegate (blah blah) yang juga mengharuskan Anda menentukan jenis parameter.

Lambdas tidak perlu mengembalikan apa pun dan jenis inferensi sangat kuat dalam konteks seperti ini.

Dan BTW, Anda selalu dapat kembali Lambdas yang membuat Lambdas dalam arti pemrograman fungsional. Misalnya, inilah lambda yang membuat lambda yang menangani acara Button.Click:

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);

Perhatikan chaining: (dx, dy) => (sender, e) =>

Sekarang itulah mengapa saya senang telah mengambil kelas pemrograman fungsional :-)

Selain dari pointer di C, saya pikir itu hal mendasar lain yang harus Anda pelajari :-)


585



Dari Rick Strahl:

Anda dapat berantai ?? operator sehingga Anda dapat melakukan banyak perbandingan null.

string result = value1 ?? value2 ?? value3 ?? String.Empty;

528



Obat generik yang dialiri:

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

Ini memungkinkan Anda untuk menggunakannya ASimpleName, dari pada Dictionary<string, Dictionary<string, List<string>>>.

Gunakan itu ketika Anda akan menggunakan hal yang sama besar kompleks yang sama besar di banyak tempat.


455



Dari CLR via C #:

Ketika normalising string, sangat tinggi   disarankan agar Anda gunakan   ToUpperInvariant sebagai gantinya   ToLowerInvariant karena Microsoft telah   dioptimalkan kode untuk melakukan   perbandingan huruf besar.

Saya ingat suatu kali rekan kerja saya selalu mengubah string menjadi huruf besar sebelum membandingkan. Saya selalu bertanya-tanya mengapa dia melakukan itu karena saya merasa lebih "alami" untuk mengonversi ke huruf kecil terlebih dahulu. Setelah membaca buku itu sekarang saya tahu mengapa.


438



Trik favorit saya adalah menggunakan operator penggabungan nol dan tanda kurung untuk membuat instantiate secara otomatis bagi saya.

private IList<Foo> _foo;

public IList<Foo> ListOfFoo 
    { get { return _foo ?? (_foo = new List<Foo>()); } }

409



Hindari memeriksa penangan kejadian nol

Menambahkan delegasi kosong ke acara pada deklarasi, menekan kebutuhan untuk selalu memeriksa acara untuk null sebelum memanggilnya luar biasa. Contoh:

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

Biarkan kamu melakukan ini

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

Daripada ini

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

Silakan lihat ini juga diskusi terkait dan ini posting blog oleh Eric Lippert tentang topik ini (dan kemungkinan kerugiannya).


314



Segala sesuatu yang lain, plus

1) generik implisit (mengapa hanya pada metode dan bukan pada kelas?)

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

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

2) lambdas sederhana dengan satu parameter:

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

3) tipe anonim dan penginisialisasi:

//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 };

Yang lainnya:

4) Properti otomatis dapat memiliki lingkup berbeda:

public int MyId { get; private set; }

Terima kasih @pzycoman untuk mengingatkan saya:

5) Namespace alias (bukan berarti Anda mungkin membutuhkan perbedaan khusus ini):

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

web::Control aWebControl = new web::Control();
win::Control aFormControl = new win::Control();

305