2009-03-13 27 views
7

Tôi chỉ xử lý các chuỗi và tôi thấy mình khó chịu khi các chuỗi có thể bị vô hiệu. Vì vậy, tôi phải cóQuyết định ngôn ngữ nào trong C# làm phiền bạn?

if((teststring??string.Empty)==string.Empty) 

tất cả mọi nơi. Chuỗi? đã rất khó khăn cho phép nullability trong các trường hợp tương đối ít, nơi nó là cần thiết (dbs, idiot đầu vào người dùng, vv). Tôi cũng thấy mình bị kích thích khi phải xuất khẩu các giao diện chỉ đọc trong các trường hợp mà tôi muốn một số dạng const đúng đắn. Vì vậy, những gì C# ngôn ngữ xây dựng/quyết định làm phiền bạn?

EDIT: Cảm ơn chức năng isnullorempty, tôi chưa từng thấy điều đó trước đây! Vẫn không giảm bớt khó chịu của tôi lúc đó là nullable: D

+10

hoặc bạn có thể làm nếu (string.IsNullOrEmpty (teststring)) ... –

+0

không phải là một jjnguy buzzkill. Đó là một câu hỏi thú vị cho một thứ sáu và chương trình liên quan của nó. Ngoài ra nó không rên rỉ, tôi tò mò những gì làm phiền mọi người. Chỉ vì có một isnullorempty không làm cho quyết định cho phép nullable strings ít gây phiền nhiễu cho tôi. – Steve

+0

Xem thêm: http://stackoverflow.com/questions/411906/c-net-design-flaws/ –

Trả lời

21

Làm cho chuỗi một loại tham chiếu có vẻ hoàn toàn hợp lý đối với tôi.

Thật đáng tiếc là người ta không thể tuyên bố loại biến/tham số/trả về là không thể rỗng mặc dù - ví dụ:

// Never returns null 
public string! Foo() 
{ 
} 

Các hợp đồng mã trong .NET 4.0 sẽ giúp ích với điều này, tôi tin - nhưng hơi muộn để phổ biến.

Một thời gian trước, tôi đã viết một blog entry on the mistakes of C#. Để tóm tắt rằng bài:

C# 1:

  • Thiếu getter riêng biệt/truy cập setter cho tài sản.
  • Thiếu thuốc generic. Cuộc sống sẽ ngọt ngào hơn rất nhiều với Generics ngay từ đầu.
  • Các lớp học không được niêm phong theo mặc định.
  • Enums chỉ được đặt tên là số.
  • Trình tự thoát "\ x" ký tự.
  • điều khác nhau về câu lệnh switch :)
  • quy tắc giải quyết
  • Một số quá tải lẻ
  • Các "khóa" từ khóa, thay vì "sử dụng" với một TOCKEN khóa.

C# 2:

  • Thiếu phương pháp từng phần (đến trong C# 3)
  • Thiếu phương sai chung (sắp tới trong C# 4)
  • Lớp System.Nullable (không Nullable<T> - đó là tốt!)
  • InternalsVisibleĐể yêu cầu toàn bộ khóa công khai cho các hội đồng được ký mạnh mẽ thay vì mã thông báo khóa công khai.

C# 3:

  • Thiếu sự hỗ trợ cho tính bất biến - rất nhiều thay đổi cải thiện cơ hội cho đột biến loại (các thuộc tính tự động, đối tượng và thu initializers) nhưng không ai trong số những thực sự làm việc với nhiều loại có thể thay đổi
  • Khám phá phương pháp mở rộng
+0

danh sách hay. Tôi thích cách tiếp cận lịch sử! – Steve

+0

Phần lớn trong danh sách phần lớn là "nó thiếu những thứ có trong phiên bản tiếp theo"; nhưng chúng tôi luôn sống sót cho đến khi họ được thêm vào ... Một số người trong số họ là những sai lầm chính hãng, mặc dù - Tôi sẽ cấp. –

+0

Giới thiệu về "nội dung trong phiên bản tiếp theo" - một số trong số này chỉ là ngớ ngẩn. Không cho phép thiết lập riêng tư? Ick. Điều đó đáng lẽ phải là một sự tốt lành rõ ràng. Một phần phương pháp sẽ có một chút khó khăn hơn để phát hiện nhu cầu. Generics rõ ràng là bắt buộc, nhưng khó xác định (tức là cần thêm thời gian). –

28

chuỗi kiểm tra cho Null hoặc rỗng là tốt nhất thực hiện bằng:

if (string.IsNullOrEmpty(testString)) 
{ 
} 
+0

Vì câu hỏi này vẫn nhận được một chút công bằng của lưu lượng truy cập, nó đáng chú ý rằng chúng tôi bây giờ có 'String.IsNullOrWhiteSpace', quá. – Yuck

0

Con đường tôi phải thực hiện các thuộc tính từ một giao diện trong C# 3,0 thậm chí mặc dù chúng chính xác giống như giao diện khi tôi không thay đổi hành vi mặc định của thuộc tính tự động.

ví dụ:

public interface MyInterface 
{ 
    int MyProperty { get; set;} 
} 

public class MyClass : MyInterface 
{ 
    public int MyProperty { get; set; } 
} 

public class MyClass2 : MyInterface 
{ 
    public int MyProperty { get; set; } 
} 

public class MyClass3 : MyInterface 
{ 
    public int MyProperty { get; set; } 
} 

EDIT: Để giải quyết một số nhận xét về điều này. Tôi không thay đổi bất kỳ hành vi mặc định nào của getter. Tôi hiểu sự khác biệt giữa lớp và giao diện thankyou, quan điểm của tôi là tôi đánh dấu nó với giao diện Tôi không cần phải có thuộc tính này bên trong mỗi lớp thực hiện trừ khi tôi muốn thay đổi hành vi mặc định của getter hoặc setter. Hãy tưởng tượng 500 lớp học triển khai giao diện này?

Ngoài ra việc thiếu mixins ..

+1

Điều này không có ý nghĩa gì? Mặc dù đó là cùng một văn bản, ý nghĩa là rất khác nhau. Giao diện chỉ là nói "Tài sản sẽ có một getter". Lớp đang nói "trình biên dịch, hãy tạo một trường riêng và trả về nó chưa được sửa đổi bên trong bộ nạp". –

+1

Quyết định này có ý nghĩa đối với tôi. Nếu không có điều này, làm thế nào bạn sẽ phân biệt nếu giao diện của bạn CHỈ yêu cầu một tài sản có được, hoặc chỉ một tài sản được thiết lập? Điều gì sẽ xảy ra nếu lớp của bạn không sử dụng các thuộc tính tự động (hoặc được mở rộng với logic trong v2)? –

+0

Có nhưng những gì tôi nói là một khi tôi đã thực hiện giao diện mà tài sản nên được thực hiện đằng sau hậu trường trừ khi tôi muốn thay đổi nó. Tôi chỉ tìm thấy, đặc biệt là với các đối tượng truyền dữ liệu mà tôi đang viết cùng một mã hơn và hơn. –

5

ra và ref thông số

+1

Bạn xử lý bằng cách nào khác? –

+4

Trả lại đối tượng kết hợp. –

+0

+1 Có, điều này, 100%. Tôi ** ghét ** rằng 'TryParse' sử dụng các tham số đầu ra. Sẽ đáng yêu cho 'Int32.TryParse' để trả về một đối tượng' ParseResult 'với các thuộc tính' Exception' và 'Value'. – Yuck

1

Mở rộng về câu trả lời của Mitch.

Đó thực sự là quyết định CLR, không phải là quyết định của C#. C# không kiểm soát các chi tiết thực hiện của lớp System.String của BCL.

True C# có thể có chuỗi ký tự đặc biệt trong trình biên dịch và cho biết chúng tôi sẽ thực hiện kiểm tra null đặc biệt nhưng điều đó sẽ có IMHO, là một quyết định tồi. String.IsNullOrEmpty là một thỏa hiệp có thể chấp nhận được.

+0

cảm ơn lời giải thích. – Steve

6

Có lẽ lỗ hổng lớn nhất trong C# là, đối với tôi, enums.

Java enums là các lớp an toàn mà bạn có thể đưa ra hành vi, có thể triển khai giao diện, v.v.

C# /. Net enums chỉ là glorified ints với tất cả các vấn đề int hằng số đã quay trở lại C và C++.

+1

Mặt khác, bạn có thể dễ dàng mô phỏng các enum Java phức tạp bằng cách viết nó như một lớp: p Điều duy nhất bạn bỏ lỡ là khả năng 'chuyển' về họ. – JulianR

+0

Không có nhiều hơn thế nữa, như kiểm soát bao nhiêu trường hợp có giá trị thông thường thông qua tuần tự hóa/deserialization và như vậy. – cletus

1

Thực thi ngắt trong trường hợp không trống.

Độ trong của enums, đặc biệt trong trường hợp phát biểu. Nếu tôi có chuyển đổi (expr) và expr là một enum, tôi không nên bị buộc phải đủ điều kiện mỗi enum trong mỗi trường hợp, trừ khi có xung đột đặt tên.

0

Không cho phép thay đổi đồng/trường hợp bị sai hoặc quyền truy cập khi trọng lớp cơ sở hoặc thực hiện phương thức giao diện:

public class A 
{ 
    protected virtual Stream method() 
    { 
     //...stuff... 
    } 
} 

public class B : A 
{ 
    // compiler borks... 
    public override FileStream method() 
    { 
     //...more stuff... 
    } 
} 
1

ngoại lệ Checked sẽ là tuyệt vời. Tôi biết rất nhiều người ghét họ từ Java, nhưng tôi nghĩ rằng nó luôn luôn thực thi kiểm tra sanity, đặc biệt là trên I/O. Tôi thích hầu hết những thứ mà C# đã thay đổi và/hoặc được thêm vào so với Java, nhưng tôi thực sự muốn họ chấp nhận các ngoại lệ đã kiểm tra. Bây giờ đã quá muộn (khuôn khổ .NET bị thay đổi để có chúng sẽ phá vỡ hầu hết mọi chương trình trên mạng) nhưng tôi nghĩ sẽ tốt hơn nếu có chúng.

0

Tôi ghét phải nhập IEnumerable<MyType> tất cả mọi nơi. Rất khó đọc. Tôi muốn một số loại ngắn tay cho nó để làm cho mã của tôi sạch hơn.

Điều này SO post tổng hợp nó một cách độc đáo.

0

Tôi thấy nó rất khó chịu vì rất nhiều phương pháp cốt lõi là tĩnh, đặc biệt là các công cụ thường được sử dụng như Strings và mảng.

Tại sao:

Array.Sort(myArray); 
String.IsNullOrEmpty(myString); 

thay vì:

myArray.Sort(); 
myString.IsNullOrEmpty 

Không nói không có lý do chính đáng cho nó và nó không phải là một vấn đề lớn, nhưng nếu JS có thể quản lý nó, tại sao có thể' t C#? *

Ngoài ra, hãy thực hiện chuyển đổi triển khai. Tôi thực sự nghĩ rằng họ đáng lẽ phải tin tưởng chúng tôi với sự sụp đổ.

* Hãy đến với điều đó tôi bỏ lỡ cú pháp đóng của JS.

0

Tôi không thích IDisposable/Dispose vv Đến từ C++ rất khó chịu khi thấy mình phải suy nghĩ về quản lý bộ nhớ trong C#. Câu lệnh sử dụng là tốt nếu đối tượng dùng một lần chỉ được sử dụng trong một hàm. Nếu nó phải được thông qua xung quanh bạn cần phải tự tham khảo đếm hoặc làm điều gì đó khác để biết khi nào bạn có thể vứt bỏ đối tượng.

0

Tôi muốn xem các đối tượng lớp là đối tượng lớp đầu tiên trong ngôn ngữ.

Điều này sẽ cho phép bạn ghi đè phương pháp tĩnh và khai báo chúng trong giao diện.

Các vấn đề liên quan