Cách ngắn nhất để kiểm tra null và gán giá trị khác nếu không


86

Tôi đang lấy varcharcác giá trị ra khỏi DB và muốn đặt giá trị stringmà tôi đang gán cho chúng là "" nếu chúng có null. Tôi hiện đang làm như thế này:

if (string.IsNullOrEmpty(planRec.approved_by) == true)
  this.approved_by = "";
else
  this.approved_by = planRec.approved_by.toString();

Có vẻ như cần phải có một cách để làm điều này trong một dòng duy nhất như:

this.approved_by = "" || planRec.approved_by.toString();

Tuy nhiên tôi không thể tìm thấy một cách tối ưu để làm điều này. Có cách nào tốt hơn không hoặc là cách tốt nhất để làm điều đó?


5
== true là không cần thiết ở đây ...
cjk

Câu trả lời:


104

Thử cái này:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? "" : planRec.approved_by.toString();

Bạn cũng có thể sử dụng toán tử kết hợp null như người khác đã nói - vì chưa ai đưa ra ví dụ hoạt động với mã của bạn ở đây là:

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString();

Nhưng ví dụ này chỉ hoạt động vì một giá trị có thể this.approved_bygiống với một trong những giá trị tiềm năng mà bạn muốn đặt nó. Đối với tất cả các trường hợp khác, bạn sẽ cần sử dụng toán tử điều kiện như tôi đã trình bày trong ví dụ đầu tiên của mình.


8
Không phải toán tử liên kết null này luôn ném ra một nullreference? Con đường tôi nhìn thấy mã này nào sau đây: if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}. Nếu tôi sai xin vui lòng chỉ ra lỗi.
Destrictor

10
@Destrictor nói đúng, mã bị hỏng. Đây là một cách khắc phục bằng cách sử dụng một toán tử thú vị khác: this.approved_by = planRec.approved_by?.toString() ?? ""; <- Đó là toán tử điều kiện rỗng và tôi không nghĩ rằng nó đã xảy ra khi câu hỏi này lần đầu tiên được hỏi và trả lời. Hy vọng rằng OP nhìn thấy điều này, để anh ấy có thể cấu trúc lại mã 7 năm tuổi của mình, từ hai công việc trước :).
Patrick


30

Bạn đang tìm toán tử liên hợp C #: ??. Toán tử này nhận đối số trái và phải. Nếu bên trái của toán tử là null hoặc null không có giá trị, nó sẽ trả về đối số bên phải. Nếu không nó sẽ trả về bên trái.

var x = somePossiblyNullValue ?? valueIfNull;

Câu trả lời này không bao gồm tất cả các trường hợp từ câu hỏi (chỉ một phần). Lưu ý rằng có "string.IsNullOrEmpty". Vì vậy, trường hợp trống không được xử lý ở đây.
Bronek

28

Tôi đoán là điều tốt nhất bạn có thể nghĩ ra là

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty
                                                      : planRec.approved_by.ToString();

Tất nhiên vì bạn đang ám chỉ thực tế approved_bylà một object(không thể bằng ""), điều này sẽ được viết lại thành

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();

20

Với C # 6, có một cách ngắn hơn một chút cho trường hợp planRec.approved_by không phải là một chuỗi:

this.approved_by = planRec.approved_by?.ToString() ?? "";

15

Sử dụng toán tử liên kết C #: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;

15

Bắt đầu với C # 8.0, bạn có thể sử dụng toán tử ?? = để thay thế mã của biểu mẫu

if (variable is null)
{
    variable = expression;
}

với mã sau:

variable ??= expression;

Thông tin thêm ở đây



2

Để gán một biến không rỗng mà không lặp lại tên biến thực (và không gán bất kỳ thứ gì nếu biến là rỗng!), Bạn có thể sử dụng một phương thức trợ giúp nhỏ với một Actiontham số:

public static void CallIfNonEmpty(string value, Action<string> action)
{
    if (!string.IsNullOrEmpty(value))
        action(value);
}

Và sau đó chỉ cần sử dụng nó:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);

1

Bạn cũng có thể làm điều đó trong truy vấn của mình, chẳng hạn như trong máy chủ sql, google ISNULLCASEcác hàm tích hợp.


-4

Tôi sử dụng phương pháp mở rộng SelfChk

static class MyExt {
//Self Check 
 public static void SC(this string you,ref string me)
    {
        me = me ?? you;
    }
}

Sau đó sử dụng như

string a = null;
"A".SC(ref a);

Tôi đoán bạn muốn nói nhưng không dễ đọc và dễ hiểu, vậy à?
Ali Humayun

3
Tăng lên! Bạn đang hoàn toàn đúng: Rất ngắn, nhưng KHÔNG dễ đọc và dễ hiểu (ít nhất là nếu bạn không được sử dụng để ký hiệu này)
Jack Miller

tốt trong trường hợp đó, hãy thử đọc một cuốn sách. Bạn sẽ thấy nó thực sự elaborative và dễ hiểu: p
Ali Humayun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.