Bagaimana cara menggunakan fitur C # 6 "Menggunakan statis"?

123

Saya melihat beberapa fitur baru di C # 6, khususnya, "menggunakan statis" .

using static adalah jenis baru penggunaan klausa yang memungkinkan Anda mengimpor anggota statis jenis langsung ke dalam cakupan.
(Bagian bawah posting blog)

Idenya adalah sebagai berikut, menurut beberapa tutorial yang saya temukan,
Daripada:

using System;

class Program 
{ 
    static void Main() 
    { 
        Console.WriteLine("Hello world!"); 
        Console.WriteLine("Another message"); 
    } 
}

Anda dapat menghilangkan Consolepernyataan berulang , menggunakan fitur C # 6 baru menggunakan kelas statis:

using System.Console;
//           ^ `.Console` added.
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } // ^ `Console.` removed.
}

Namun, ini tampaknya tidak berhasil untuk saya. Saya mendapatkan kesalahan pada usingpernyataan, yang mengatakan:

"A ' using namespace' directive hanya bisa diterapkan ke namespace; ' Console' adalah tipe bukan namespace. Pertimbangkan ' using static' directive sebagai gantinya"

Saya menggunakan visual studio 2015, dan versi bahasa build saya disetel ke "C # 6.0"

Apa yang memberi? Apakah contoh blog msdn salah? Mengapa ini tidak berhasil?


Entri blog sekarang telah diperbarui untuk mencerminkan pembaruan terkini, tetapi berikut tangkapan layarnya jika blog mati:

blog

Cerbrus
sumber

Jawaban:

177

Tampaknya sintaksnya sedikit berubah sejak postingan blog tersebut ditulis. Seperti pesan kesalahan yang disarankan, tambahkan staticke pernyataan include Anda:

using static System.Console;
//      ^
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } 
}

Kemudian, kode Anda akan dikompilasi.


Perhatikan bahwa, di C # 6.0, ini hanya akan bekerja untuk anggota yang dideklarasikan sebagai static.

Misalnya, pertimbangkan System.Math:

public static class Math {
    public const double PI = 3.1415926535897931;
    public static double Abs(double value);
    // <more stuff>
}

Kapan using static System.Math, Anda bisa menggunakan Abs();.
Namun, Anda masih harus awalan PIkarena tidak anggota statis: Math.PI;.

Dimulai dengan C # versi 7.2, seharusnya tidak demikian, constnilai seperti PIdapat digunakan juga.

Cerbrus
sumber
3
Saya mengalami masalah yang serupa, tetapi justru dengan System.Math, secara khusus Math.PI. Ketika saya menggunakan using static System.Math, metode suka Sqrt()bekerja tetapi tidak seperti konstan PI. Saya harus terus menulis Math.PIatau kode tidak dapat dikompilasi. Saya ingin tahu mengapa ini tidak berhasil. Haruskah saya mengajukan pertanyaan baru untuk ini?
sepatu roda
5
@skwear: kedengarannya seperti bahan untuk pertanyaan baru, ya.
Cerbrus
1
Sebagai jawaban cepat untuk pertanyaan @ skwear: "using static adalah jenis baru penggunaan klausa yang memungkinkan Anda mengimpor anggota statis <...>" . PIbukan statis anggota dari Mathkelas. Itu konstan. Sederhananya: anggota harus dinyatakan sebagai static.
Cerbrus
3
Kedengarannya seperti peluang untuk sintaks baru seperti: using const System.Math;:)
Filip Skakun
1
Contoh dalam dokumentasi Microsoft mengklaim PI dapat digunakan tanpa awalan: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Guney Ozsan
1

The staticKeyword pada usingpernyataan akan mengimpor hanya satu, jenis tertentu (dan itu jenis bersarang). Selanjutnya Anda tidak boleh memberikan nama jenis lagi. Jadi tambahkan saja statis ke penggunaan Anda.

Catatan: Gunakan fitur ini hanya jika kedua kelas terkait erat secara logis, jika tidak maka akan sulit untuk membaca kode.

Tobias Brohl
sumber
"Anda tidak boleh memberikan nama tipe" Apa yang Anda maksud dengan itu? Dimana saya melakukan itu?
Cerbrus
Thobias, saya tidak akan menggabungkan keduanya di mana pun.
Cerbrus
@Cerbrus Oh konteks 'seperti yang Anda lakukan' secara tidak sengaja berubah, akan memperbaikinya
Tobias Brohl