110,534
社区成员
发帖
与我相关
我的任务
分享
Using rep As HttpWebResponse = xmlhttp.GetResponse()
Using reps As Stream = rep.GetResponseStream()
x = GetRepText(reps)
End Using
End Using
Public Function GetRepText(ByRef reps As Stream, Optional Encode As String = "UTF-8") As String
Using streamreader As StreamReader = New StreamReader(reps, Encoding.GetEncoding(Encode))
Return streamreader.ReadToEnd
End Using
End Function
using (HttpWebResponse rep = (HttpWebResponse)xmlhttp.GetResponse())
{
using (Stream reps = rep.GetResponseStream())
{
x = a.GetRepText(ref reps);
}
}
class a{
static public string GetRepText(ref Stream reps, string Encode = "UTF-8")
{
using (StreamReader streamreader = new StreamReader(reps, Encoding.GetEncoding(Encode)))
{
return streamreader.ReadToEnd();
}
}
}
}
Sub aa(ByRef x As A)
x = New A
Debug.Assert(x.TheTimes = 2)
End Sub
可键 TheTimes 一会儿为2,一会儿(在 using结构中)为1。所以 vb.net 虽然得到了跟 c# 一样的结果(!),但是它的编译器太不靠谱了,对于写 ref 的不给报错提示。Imports System
Module Program
Sub Main(args As String())
Using a = New A
Debug.Assert(a.TheTimes = 1)
Debug.Assert(A.Times = 1)
aa(a)
Debug.Assert(a.TheTimes = 1)
Debug.Assert(A.Times = 2)
End Using
End Sub
Sub aa(ByRef x As A)
x = New A
End Sub
End Module
Class A
Implements IDisposable
Sub New()
Times += 1
_Times = Times
End Sub
Public Shared Times As Integer
Private _Times As Integer
Public ReadOnly Property TheTimes As Integer
Get
Return _Times
End Get
End Property
Public Sub Dispose() Implements IDisposable.Dispose
End Sub
End Class
这里可看到,在 aa 方法中的断言证明 TheTimes 为 2,而在 using 结构中第二个断言证明 TheTimes 仍然为 1。
于是程序员就糊涂了!
说实在的,在使用了 c# 较长一段时间之后,就会觉得 vb.net 在动态特征上搞的这些”贴心的改变“其实是有点过分了。这里又允许 ref,同时又自动修改回 a 变量的引用,那么 vb.net 这种算是什么神操作啊?这个 vb.net 用起来会看来更繁琐了。Imports System
Module Program
Sub Main(args As String())
Using a = New A
Debug.Assert(a.TheTimes = 1)
aa(a)
Debug.Assert(a.TheTimes = 1)
End Using
End Sub
Sub aa(ByRef x As A)
x = New A
End Sub
End Module
Class A
Implements IDisposable
Sub New()
Times += 1
End Sub
Private Shared Times As Integer
Public ReadOnly Property TheTimes As Integer
Get
Return Times
End Get
End Property
Public Sub Dispose() Implements IDisposable.Dispose
End Sub
End Class
可以看到,第二个断言失败!在编程中,这类 ref 就是一个害人精,而此时助纣为虐的 vb.net 编译器确实是不靠谱的。
我们编程设计中最忌讳地就是扯什么“动态、注入、任意变异类型”的那种害人精的爱好。我们编程要靠谱,所以要求编译器要能在编译器就检查出来尽可能多的设计错误或者说危险的设计模式,决不让那些喜好诡异编码的做法(在运行时、跑几十遍产生特殊数据时才在用户面前丢失人地崩溃,并且难以调试跟踪)轻易混入开发队伍。我们了解哪些才是必要的抽象,哪些是看似高大上实则是要不得的动态特性!