2010-06-11 2 views
1

Почему следующий код VB.NET установки str в настоящее время в моей VS2005 IDE:VB.NET: короткие сокращения кода

If Trim(str = New StreamReader(OpenFile).ReadToEnd) <> "" Then 
    Button2.Enabled = True 
    TextBox1.Text = fname 
End If 

OpenFile это функция, которая возвращает FileStream

EDIT: Если приведенная выше строка, содержащая Trim, неверна, есть ли способ достижения намеченного результата только в одной строке?

+0

Может быть полезно включить дополнительную информацию о методе 'OpenFile()'. –

+2

Почему вы хотите получить свое намеренное решение для одной строки? Разбивка образца на две или три строки улучшит читаемость и облегчит диагностику проблемы в отладчике. –

+0

@ Dan: проще управлять меньшим количеством строк кода. – CJ7

ответ

5

код никогда не устанавливая str вообще:

If Trim(str = New StreamReader(OpenFile).ReadToEnd) <> "" Then 

Эта линия не устанавливает str, он сравнивает это результат чтения файла.

В VB оператор = имеет два значения, в зависимости от контекста. Если используется в заявлении , он присваивает правому выражению левому выражению. Если используется в любом другом контексте (т. Е. В выражении), он выполняет сравнение равенства, , а не назначение.

Таким образом, в VB вы должны написать следующее:

str = New StreamReader(OpenFile()).ReadToEnd() 
If str.Trim() <> "" Then … 

Обратите внимание, что я заменил свободную функцию Trim при вызове метода, чтобы сделать код более совместимым с практикой общего .NET кодирования.

+0

+1: Правильный ответ и самые быстрые пальцы :) –

+0

благодарю вас. Почему вы использовали() рядом с вызовами метода, когда это не нужно в VB? – CJ7

+0

@Craig: VB может не применять его, но постоянное выполнение этого может помочь в удобочитаемости. – reinierpost

0

Потому что вы не устанавливать ул, вы сравниваете его, а затем обрезку результат сравнения (в основном обрезки либо «True» или «False»

If Trim(str = New StreamReader(OpenFile).ReadToEnd) <> "" Then

Это на самом деле не набор ул, это сломается на следующий код

Dim str as string ' Defaults to nothing/"" 
Dim boolValue as bool = (str = New StreamReader(OpenFile).ReadToEnd) 

If Trim(boolValue) <> "" Then 
    ' This is always true, as "True" and "False" will never = ""' 
... 
End If 
+0

Nitpick: 'Dim str as string' does * not * set' str' to '" "', он устанавливает значение 'Nothing'. –

+0

@ Konrad: Вы правильно указали. , , как я :) Некоторое безумие VB После 'dim s как string: dim b как boolean = (S ничего)' b истинно. После 'dim s как string: dim b как boolean = (S =" ")' b ** также ** true. Вы должны любить VB (или нет). Отказ от ответственности: любящий VB является необязательным) –

+1

Причина проста: '=' для строк в VB не разрешает 'String.Equals', а' Microsoft.VisualBasic.CompilerServices.Operators .CompareString ': http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.compilerservices.operators.comparestring(v=VS.100).aspx, который предлагает специальное лечение для' Nothing'. Но попробуйте следующее: 'Dim s As String: Dim b = s Is" "', чтобы увидеть, что '' '* * * не инициализируется пустой строкой. –

3

Первое, что нужно сделать при запуске любого проекта VB.Net, чтобы убедиться, что Option Explicit и Option Strict оба устанавливаются истина в настройках проекта. Только е ver отключить любой из них, если у вас есть определенная причина (вам нужно опоздание или перехватить какой-то старый ужасный код).

Это могло бы остановить этот код даже при компиляции и сразу же отобразило бы вам ошибку.

+0

Я согласен с тем, что использование 'Strict' и' Explicit' является обязательным, но это не помешало бы компиляции кода. –

+0

@ Konrad Rudolph: Это дало бы ошибку в инструкции 'Trim', поскольку она запретила бы неявное преобразование из' Boolean' в 'String'. –

+0

@ ho1: Нет. Код * сравнивает * две строки (обрезанная строка и пустая строка). –

Смежные вопросы