2009-08-28 4 views
2

мой запрос прост, как и я, если это возможно, на C#.Структуры логических операторов в C#

<html> 
<head> 
<script src="../jquery-1.3.2.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $(function(){ 
     $("#datos").append("<span style=\"font-weight:bold\">(false || null || \"1º\" || \"2º\")</span> : <span>"+(false || null || "1º" || "2º")+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(false && null || false || \"2º\")</span> : <span>"+(false && null || false || "2º")+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(false && true || \"1º\" || \"2º\")</span> : <span>"+(false && true || "1º" || "2º")+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(true && null && 6 && 5)</span> : <span>"+(true && null && 6 && 5)+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(null && true && false && false)</span> : <span>"+(null && true && false && false)+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(false && true && false && false)</span> : <span>"+(false && true && false && false)+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(true && 1 && true && 2)</span> : <span>"+(true && 1 && true && 2)+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(true && \"1º\" && true && \"2º\")</span> : <span>"+(true && "1º" && true && "2º")+"</span><br />"); 
     $("#datos").append("<span style=\"font-weight:bold\">(true && true && \"1º\" && \"2º\")</span> : <span>"+(true && true && "1º" && "2º")+"</span><br />"); 
    }); 
</script> 
</head> 
<body> 
<div id="datos"></div> 
</body> 
</html> 

Вернуться к HTML:

(false || null || "1º" || "2º") : 1º 
(false && null || false || "2º") : 2º 
(false && true || "1º" || "2º") : 1º 
(true && null && 6 && 5) : null 
(null && true && false && false) : null 
(false && true && false && false) : false 
(true && 1 && true && 2) : 2 
(true && "1º" && true && "2º") : 2º 
(true && true && "1º" && "2º") : 2º 

Спасибо.

- EDIT для комментариев

Мне нужно выполнить следующие действия в C#:

string value1 = string.Empty; 
string value2 = "default value"; 

// Request.Form["valueA"] and Request.Form["valueB"] may be null 
value1 = (Request.Form["valueA"] || Request.Form["valueB"] || value2); 
+3

Я понятия не имею, что вы просите ... – RedFilter

+0

В чем вопрос? –

+0

Вопрос в том, что '(false || null ||" 1º "||" 2º ")' оценивается с C# до. В ответе, что он не компилируется, поскольку логические операторы C# строго типизированы. Но я думаю, было бы интересно узнать, есть ли способ написать что-то подобное в C# ... – dtb

ответ

3

Эти выражения недопустимы в C#, так как .NET || и && операторов сильно типизированных.

Там есть, однако, x ?? y оператор, который возвращает y если x является null и x иначе:

string value1; 
string value2 = "default value"; 

value1 = Request.Form["valueA"] ?? Request.Form["valueB"] ?? value2; 
           ^      ^
+0

+1. Но что произойдет, если url содержит «? ValueA = & valueB = Hello»?;) – AnthonyWJones

+0

@ Энтони Ничего не случится строка "" не влияет на ??? ни переменные –

+0

EDIT: и = any –

1

Если я правильно понял ваш «вопрос» правильно, вы должны понимать, что C# ручки ввести более строгий способ , Null не считается ложным, на самом деле единственным типом, который вы можете использовать в логическом выражении, является логическое, в отличие от javascript, которое примет любой тип в булево выражение и сделает некоторое разумное предположение о том, что имеется в виду.

Единственный оператор, который приближается к тому, что вы делаете в Javascript, является? : -

var r1 = (null ?? "1º" ?? "2º") // Results in 1º 
var r2 = (null ?? null ?? "2º") // Results in 2º 

Однако это не работает: -

var r1 = (null ?? 1 ?? 2) //Compile error 

Целые типы значений и не может быть пустым.

Решение Редактировать

Всякий раз, когда есть малейший намек на «обработку» значений строки запроса/формы перед использованием я бы заправить все это прочь в собственность. (На самом деле я стараюсь разместить весь такой доступ в собственности, даже если его просто {return Request.QueryString["stuff"]; }).

string _Value; 
public string Value 
{ 
    get 
    { 
     if (_Value == null) 
     { 
     _Value = CoalesceNullOrEmpty(Request.Form["valueA"], 
      Request.Form["valueB"], 
      "Default Value"); 
     } 
     } 
     return _Value; 
    } 
} 

//Can place this in the page but is more useful in a utility dll 
public string CoalesceNullOrEmpty(params string[] values) 
{ 
    foreach(string value in values) 
    if (!String.IsNullOrEmpty(value)) 
     return value; 

    return null; 
} 

Теперь используйте свойство Value, в котором вы использовали свойство value1.

0

Если вам нужна серия bools, почему бы не написать класс, который преобразует для вас, применяя нужные правила. Если ваши правила «если это значение равно null, это значение false, если оно не пустое, это логическое значение, иначе оно истинно», то этот метод будет работать для вас.

static List<bool> ToBool(FormCollection form) { // couldn't find the type on MSDN 
    List<bool> result = new List<Bool>(); 
    foreach (object o in form) { 
     if (o == null) { 
      result.Add(false); 
     } 
     else { 
      if (o is bool) { 
       result.Add((bool)o); 
      } 
      else { 
       // do whatever other conversion 
       result.Add(true); // probably the wrong thing - depends on what you're testing 
      } 
     } 
    } 
    return result; 
} 
Смежные вопросы