2010-07-12 33 views
8

Trong trình khởi tạo C#, tôi không muốn đặt thuộc tính nếu điều kiện là sai.C# initialiser assignment có điều kiện

Something như thế này:

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    if (!windowsAuthentication) 
    { 
     Login = user, 
     Password = password 
    } 
}; 

Nó có thể được thực hiện? Làm cách nào?

Trả lời

9

Bạn không thể làm điều này; Trình khởi tạo C# là danh sách các cặp name = value. Xem tại đây để biết chi tiết: http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx#cs3spec_topic5

Bạn cần di chuyển khối if sang dòng sau.

+3

Xin chào, tại sao bạn lại bỏ phiếu? Thông tin này có đúng không? –

+0

Có cách tốt hơn, như @SLaks được đề cập bên dưới –

21

Điều này là không thể trong bộ khởi tạo; bạn cần phải thực hiện một tuyên bố riêng biệt if.

Ngoài ra, bạn có thể viết

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    Login = windowsAuthentication ? null : user, 
    Password = windowsAuthentication ? null : password 
}; 

(Tùy thuộc vào cách ServerConnection công trình lớp học của bạn)

+0

Tại sao này downvoted? – SLaks

+0

Đó là lỗi của tôi. Tôi ban đầu downvoted bạn khi tất cả các bạn đã có trong câu trả lời của bạn là nó không thể, trước khi bạn thêm các nhà khai thác đại học của bạn. Bây giờ nó dường như bị khóa và tôi không thể hủy bỏ phiếu bầu. Cảm ơn barfs! – Randolpho

+1

@Randolpho: Bây giờ bạn có thể hủy bỏ nó. – SLaks

3

Lưu ý: Tôi không khuyên bạn nên phương pháp này, nhưng nếu nó phải được thực hiện trong một initializer (tức là bạn đang sử dụng LINQ hoặc một số nơi khác mà nó phải là một tuyên bố duy nhất), bạn có thể sử dụng điều này:

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    Login = windowsAuthentication ? null : user, 
    Password = windowsAuthentication ? null : password, 
} 
5

Tôi nghi ngờ điều này sẽ hiệu quả, nhưng sử dụng logic theo cách này sẽ đánh bại mục đích sử dụng bộ khởi tạo.

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
    Login = windowsAuthentication ? null : user, 
    Password = windowsAuthentication ? null :password 
}; 
3

Như những người khác đã đề cập, điều này không thể thực hiện chính xác trong trình khởi tạo. Có thể chấp nhận chỉ gán null cho thuộc tính thay vì không thiết lập nó không? Nếu có, bạn có thể sử dụng cách tiếp cận mà người khác đã chỉ ra. Dưới đây là một thay thế hoàn thành những gì bạn muốn và vẫn sử dụng cú pháp initializer:

ServerConnection serverConnection; 
if (!windowsAuthentication) 
{ 
    serverConection = new ServerConnection() 
    { 
     ServerInstance = server, 
     LoginSecure = windowsAuthentication, 
     Login = user, 
     Password = password 
    }; 
} 
else 
{ 
    serverConection = new ServerConnection() 
    { 
     ServerInstance = server, 
     LoginSecure = windowsAuthentication, 
    }; 
} 

Theo ý kiến ​​của tôi, nó không nên thực sự quan trọng hơn nhiều. Trừ khi bạn đang đối phó với các loại vô danh, cú pháp khởi tạo chỉ là một điều tốt đẹp để có tính năng có thể làm cho mã của bạn trông gọn gàng hơn trong một số trường hợp. Tôi sẽ nói, không đi ra khỏi con đường của bạn để sử dụng nó để khởi tạo tất cả các tài sản của bạn nếu nó hy sinh khả năng đọc. Không có gì sai với việc đoạn mã sau thay vì:

ServerConnection serverConnection = new ServerConnection() 
{ 
    ServerInstance = server, 
    LoginSecure = windowsAuthentication, 
}; 

if (!windowsAuthentication) 
{ 
    serverConnection.Login = user, 
    serverConnection.Password = password 
} 
0

Làm thế nào về điều này:

ServerConnection serverConnection = new ServerConnection(); 

serverConnection.ServerInstance = server; 
serverConnection.LoginSecure = windowsAuthentication; 

if (!windowsAuthentication) 
{ 
    serverConnection.Login = user; 
    serverConnection.Password = password; 
} 
Các vấn đề liên quan