2009-01-09 35 views
10

Tôi là nhà phát triển C#. Tôi thực sự yêu dấu ngoặc nhọn bởi vì tôi đến từ C, C++ và nền Java. Tuy nhiên, tôi cũng thích các ngôn ngữ lập trình khác của .NET Family như VB.NET. Chuyển đổi qua lại giữa C# và VB.NET không thực sự là vấn đề lớn nếu bạn đã lập trình được một thời gian trong .NET. Đó là cách tiếp cận rất phổ biến trong công ty tôi làm việc. Là C# guy, tôi thực sự thích các từ khóa XML và with được cung cấp bởi trình biên dịch VB.NET. Tôi muốn Microsoft đã bao gồm những tính năng trong C# cũng.Tại sao cấu trúc with() không được bao gồm trong C#, khi nó thực sự tuyệt vời trong VB.NET?

Tôi chỉ tò mò, những gì nhà phát triển khác phải nói về điều đó!

+2

VB yêu thích của tôi "thêm" là mệnh đề khi có ngoại lệ - ví dụ: "catch x as my_exception khi x.code = 100" hoặc "catch x as exception khi retries = 3" – gbjbaanb

Trả lời

0

Tôi sẽ không ngạc nhiên nếu "Có" hoặc tính năng tương tự được thêm vào C# cùng với các tính năng độc quyền phổ biến khác của VB. Có rất nhiều cuộc nói chuyện trong các bản trình bày xem trước C# 4.0 gần đây tại PDC và các nơi khác đã tăng "tập trung vào tính chẵn lẻ ngôn ngữ" bắt đầu bằng C# 4.0 và VB 10.

16

Cá nhân tôi không thích WITH khi nó được sử dụng sau khi xây dựng - nếu bạn cần thực hiện một vài điều với một đối tượng sau khi nó được khởi tạo, thường hành vi đó phải được đóng gói trong chính loại đó. Nếu bạn thực sự muốn làm một cái gì đó như WITH, nó chỉ là một vấn đề tuyên bố một biến ngắn và tùy chọn giới thiệu một phạm vi mới.

Tuy nhiên, nó hữu ích để có thể gọn khởi tạo một đối tượng với nhiều tính - đó là chính xác lý do tại sao C# 3 cho phép bạn viết:

MyObject x = new MyObject { Name="Fred", Age=20, Salary=15000 }; 

Có những hạn chế này (mà không bắt buộc và các thông số được đặt tên trong C# 4 sẽ giúp khắc phục) nhưng nó tốt hơn so với nó mà không dẫn đến những rối loạn/mơ hồ tiềm ẩn.

(Trên mặt trước XML, tôi lại thuộc nhóm C# - XML ​​là một công nghệ rất cụ thể để đưa vào ngôn ngữ. Nếu họ có thể đưa ra một biểu mẫu tổng quát đã xảy ra để tạo XML nhưng có thể được sử dụng để tạo các cây khác nữa, điều đó sẽ tốt đẹp - giống như các biểu thức truy vấn không được liên kết trực tiếp với IEnumerable hoặc IQueryable.)

+0

Hoàn toàn đồng ý với nhận xét của bạn về các chữ XML. +1 –

+0

XML là một công nghệ phổ biến để sử dụng trong .NET, mọi thứ đều sử dụng nó: (Bây giờ, nếu họ đã làm Linq2Sql làm việc với DBs không sqlserver, bạn sẽ có một điểm :) – gbjbaanb

+1

XML chắc chắn có mặt ở nhiều nơi trong khuôn khổ .NET - nhưng tôi không nghĩ rằng nó xứng đáng là một nơi đặc biệt trong chính ngôn ngữ đó, tài liệu sang một bên. –

3

Bạn có thể thay thế With của VB.Net bằng cách tạo tên biến chữ cái nhanh. Nó thực sự ít mã hơn, vì With cũng yêu cầu một số End With sau này.

Ví dụ: một điều tôi thường cần thực hiện thường xuyên là lặp qua các hàng trong một dữ liệu có thể lập biểu cho báo cáo kiểu kiểm soát/ngắt.

Trong vb.net, mà có thể trông như thế này:

Dim CurCustomerName As String 
Dim CustomerSalesTotal As Decimal 

Dim ds As DataSet = GetReportData() 
With ds.Tables(0).Rows 
    Dim i As Integer = 0 
    While i < .Count 
     ''//{ 
     CurCustomerName = .Item(i)("CustName") 
     CustomerSalesTotal = 0 
     PrintHeaderLine(CurCustomerName) 

     While i < .Count AndAlso CurCustomerName = .Item(i)("CustName") 
      ''//{ 
      PrintItemLine(.Item(i)("OrderTotal")) 
      CustomerSalesTotal += .Item(i)("OrderTotal") 

      i+= 1 
     End While ''//} 
     PrintSubTotalLine(CustomerSalesTotal) 
    End While ''//} 
End With 

C# sẽ trông như thế này:

string CurCustomerName; 
Decimal CustomerSalesTotal; 

DataSet ds = GetReportData(); 
DataRowCollection r = ds.Tables[0].Rows; 
int i=0; 
while (i<r.Count) 
{ 
    CurCustomerName = r[i]["CustName"]; 
    CustomerSalesTotal = 0; 
    PrintHeaderLine(CurCustomerName); 

    while (i<r.Count && CurCustomerName == r[i]["CustName"]) 
    { 
     PrintItemLine(r[i]["OrderTotal"]); 
     CustomerSalesTotal += r[i]["OrderTotal"]; 

     i++; 
    } 
    PrintSubTotalLine(CustomerSalesTotal); 
} 

Những điều cần chú ý ở đây là # phiên bản C thực sự cần thiết ít gõ , vì VB không thể kết hợp WITH với chỉ mục mảng và phải đi qua thuộc tính .Item cho một số thứ nhất định. Nó không phải là một vấn đề lớn ở đây, nhưng hãy tưởng tượng nếu báo cáo có 20 trường thay vì 2 và phải chia nhỏ 3 mục thay vì 1.

Tất nhiên, bạn cũng có thể sử dụng kỹ thuật này trong VB cho VB. Nhưng điều quan trọng cần lưu ý là WITH không thực sự mang lại cho bạn nhiều.

+0

Điều này làm cho mã không thể đọc được và thường là thực hành không tốt. –

+0

Không ít có thể đọc được so với 'With'- nó có giá trị cho mục đích so sánh ít nhất. –

+0

Không thể đọc được. Hãy suy nghĩ về nó như là một hàm nội tuyến có các biến bí danh như một tham số. Bạn sẽ gọi nó là không thể đọc được như một chức năng riêng biệt, phải không? – jmucchiello

1

Đó là về tùy chọn của nhà phát triển, nhưng tôi ở bên bạn về WITH. Sở thích của tôi là giảm thiểu số lượng các biến trong trò chơi và phạm vi mà chúng sinh sống. Triết lý của C# dường như giống nhau. Nhưng trong trường hợp này, các câu trả lời ở đây dường như gợi ý rằng việc thêm (và làm cho bản thân bạn chịu trách nhiệm) một biến là một điều tốt so với một cấu trúc, đối với tôi, rất giống với lambdas.

1

Tôi cảm thấy khá là tùy ý khi chỉ cho phép cài đặt thuộc tính 'khối lượng' trong khi khởi tạo. Tôi thực sự không hiểu lý do tại sao điều này sẽ là 'xấu':

MyObj myObj = ObjFactoryFunction(); 

... 

if(someCondition) 
    myObj { Prop1 = 1, Prop2 = 2 }; 

Tôi cảm thấy mã ví dụ này rõ ràng và súc tích.

1

Thông thường khi tôi thấy yêu cầu đối với một tính năng with trong C# , Tôi thấy mã sẽ được hưởng lợi từ việc tái cấu trúc. Thông thường khi việc tái cấu trúc được thực hiện, nhu cầu cho with đã biến mất.

Tôi thích cách mã của tôi hoạt động khi tôi xây dựng giao diện thông thạo cho một đối tượng; nó có một số điểm tương đồng với with. Nếu tôi được thiết kế MessageBox.Show(), tôi có thể viết:

new MessageBox() 
    .SetText("Hello World!") 
    .SetButtons(MessageBox.Buttons.OK) 
    .SetIcon(MessageBox.Icon.Information) 
    .Show(); 

Bạn cũng có thể nhìn thấy một cái gì đó tương tự với LINQ:

var q = Enumerable.Range(1, 100) 
      .Where(x => x % 2 == 0) 
      .Select(x => x * x); 

Nó cảm thấy một chút như with nhưng có vẻ phù hợp một cách tự nhiên vào ngôn ngữ tôi đã có.

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