Trong C#, sự khác biệt giữa A::B
và A.B
là gì? Sự khác biệt duy nhất tôi nhận thấy là chỉ có ::
có thể được sử dụng với global
, nhưng khác hơn thế, sự khác biệt là gì? Tại sao cả hai đều tồn tại?Toán tử phân giải phạm vi :: so với toán tử truy cập thành viên. trong C#
Trả lời
với :: bạn có thể làm những việc như ...
extern alias X;
extern alias Y;
class Test
{
X::N.A a;
X::N.B b1;
Y::N.B b2;
Y::N.C c;
}
và có những lúc. là mơ hồ như vậy :: là cần thiết. đây là ví dụ từ ngôn ngữ C# đặc tả
namespace N
{
public class A {}
public class B {}
}
namespace N
{
using A = System.IO;
class X
{
A.Stream s1; // Error, A is ambiguous
A::Stream s2; // Ok
}
}
những :: operator chỉ làm việc với bí danh toàn cầu là một hệ thống đặc biệt được cung cấp bí danh.
như vậy ... làm việc này:
using Foo = System.ComponentModel;
public MyClass {
private Foo::SomeClassFromSystemComponentModel X;
}
nhưng không này:
public MyClass {
private System.ComponentModel::SomeClassFromSystemComponentModel X;
}
này cho phép bạn thoát khỏi địa ngục của phụ namespace có thể xảy ra khi bạn đang tích hợp với thư viện nơi họ có:
namespace MyAwesomeProduct.System
{
}
Và mã bạn có
using MyAwesomeProduct;
toàn cầu :: cho phép bạn tìm thấy Hệ thống thực.
Hm ... bạn đang giải thích lý do tại sao 'global ::' rất hữu ích, nhưng không chính xác sự khác biệt giữa '::' và '. ... – Mehrdad
:: * only * hoạt động với các dấu chấm - theo cách đó nếu ai đó khai báo một không gian tên hoặc một không gian tên phụ sau đó có cùng một không gian tên như bạn bí danh mã của bạn sẽ được sử dụng tốt. Đó là thoát ra khỏi nhà điều hành nhà tù cho độ phân giải không gian tên phụ nếu bạn muốn. Bạn có quyền kiểm soát các thuật toán alaises trong tệp của mình - nhưng những người khác kiểm soát các không gian tên của các thư viện mà bạn sử dụng. :: cung cấp cho bạn quyền kiểm soát khi các không gian tên khác thay đổi để thay đổi ý nghĩa của mã của bạn. – Neil
+1 Tuyệt vời, cảm ơn. – Mehrdad
- 1. decltype và toán tử phạm vi trong C++
- 2. Toán tử Arrow so với toán tử Dot
- 3. Hiểu phạm vi của các toán tử trong C++
- 4. Là '.' để truy cập thành viên được coi là một toán tử trong Java?
- 5. Toán tử C++ lambda ==
- 6. Toán tử so sánh cho chuỗi C
- 7. toán tử [] [] C++
- 8. Các toán tử tích phân quot so với div
- 9. toán tử C++ typeid
- 10. Toán tử phân giải phạm vi trên enums một phần mở rộng trình biên dịch cụ thể?
- 11. Sự khác nhau giữa toán tử toàn cục và toán tử thành viên
- 12. Truy cập các biến thành viên riêng tư từ một toán tử gán lớp khuôn mẫu
- 13. Toán tử ghép nối (+) so với concat()
- 14. Toán tử khai thác quá tải C++ - Lỗi không thể truy cập thành viên riêng được khai báo trong lớp
- 15. Con trỏ tới QList - tại() so với toán tử []
- 16. C# = toán tử số
- 17. toán tử typeof trong C
- 18. Toán tử C++ typeof
- 19. C++ lỗi lớp mẫu với toán tử ==
- 20. toán tử logic hoặc so với || (ống đôi) trong php
- 21. Triển khai các toán tử so sánh khác về toán tử <trong một cuộc gọi
- 22. Khi nào toán tử gán mặc định C++ trở thành không thể truy cập?
- 23. Toán tử có động C#?
- 24. Toán tử gán quá tải trong C++
- 25. Hành vi Weird Solr/Lucene với toán tử boolean
- 26. Cách thay thế bằng cách sử dụng toán tử% và/Toán tử trong C++
- 27. C: unary trừ hành vi của toán tử với toán hạng chưa ký
- 28. Toán tử so sánh MySQL, dấu cách
- 29. '|| =' toán tử trong Ruby
- 30. Chuỗi so sánh: toán tử ==() vs Equals()
Vì vậy, bạn đang nói rằng '::' chỉ làm việc với không gian tên, trong khi '.' làm việc với tất cả mọi thứ ngoại trừ' global'? – Mehrdad
có, thực tế là :: chỉ dành cho không gian tên có nghĩa là bạn có thể sử dụng nó để giải quyết sự mơ hồ mà không thể được giải quyết bằng. –