所以我试图弄清楚如何GetHashCode()在VB中正确覆盖大量的自定义对象.一些搜索引导我得到这个美妙的答案.
除了有一个问题:VB缺少.NET 4.0中的checked和unchecked关键字.据我所知,无论如何.因此,使用乔恩斯基特的实现,我想对具有三个主要成员一个相当简单的类创建这样一个覆盖:Name As String,Value As Int32,和[Type] As System.Type.因此,我提出:
Public Overrides Function GetHashCode() As Int32
Dim hash As Int32 = 17
hash = hash * 23 + _Name.GetHashCode()
hash = hash * 23 + _Value
hash = hash * 23 + _Type.GetHashCode()
Return hash
End Function
Run Code Online (Sandbox Code Playgroud)
问题:即使像这样的简单对象,Int32也太小了.我测试的特定实例将"Name"作为一个简单的5个字符的字符串,并且该哈希值足够接近Int32的上限,当它试图计算哈希值(Value)的第二个字段时,它会溢出.因为我找不到粒度checked/ unchecked支持的VB等价物,所以我无法解决这个问题.
我也不想删除整个项目中的Integer溢出检查.这个东西可能...... 40%完成(我做了,TBH),我有更多的代码要写,所以我需要这些溢出检查很长一段时间.
GetHashCode对于VB和Int32 ,Jon的版本的"安全"版本是什么?或者,.NET 4.0 在某个地方有checked/ unchecked我在MSDN上很难找到吗?
编辑:
根据链接的SO问题,最底层的一个不受欢迎的答案提供了一个 …
我正在准备一个Visual Basic 2005上的一个类,目标是Visual Basic 6程序员迁移到.NET平台.
我想就是否建议他们始终启用Option Strict提出建议.
我专门使用C风格的编程语言,主要是Java和C#,所以对我来说,显式的转换是我一直希望我必须做的事情,因为它从来都不是一个选择.
但是我认识到使用内置支持后期绑定的语言的价值,因为不必过分明确代码中的类型确实可以节省时间.动态类型语言的流行扩散进一步证明了这一点即使在具有动态语言运行时的.NET平台上也是如此.
考虑到这一点,如果第一次使用VB.NET和VB6背景接近.NET的人应该被鼓励进入必须使用编译时类型检查的思维模式,因为这是"最佳实践". CLR?或者继续享受后期约束的好处是"还可以"吗?
我知道你可以将unicode字符代码放在VB.Net字符串中,如下所示:
str = Chr(&H0030) & "More text"
Run Code Online (Sandbox Code Playgroud)
我想知道如何将char代码直接放入字符串文字中,以便我可以使用设计器视图中的unicode符号.
这甚至可能吗?
我在VB.NET中有一个事件可以同时处理几个按钮点击.我需要知道选择中的哪个按钮启动了该事件.任何想法如何做到这一点?我的代码如下:
Private Sub Answer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswer1.Click, btnAnswer2.Click, btnAnswer3.Click, btnAnswer4.Click
'output button ID that caused event
End Sub
Run Code Online (Sandbox Code Playgroud)
我试过了sender.Id,e.Id,sender.name,e.name.他们都没有工作
我想在C#中做同样的事情.有没有在C#中使用参数的属性,就像我在这个VB.NET示例中使用参数'Key'一样?
Run Code Online (Sandbox Code Playgroud)Private Shared m_Dictionary As IDictionary(Of String, Object) = New Dictionary(Of String, Object)
Public Shared Property DictionaryElement(ByVal Key As String) As Object
Get
If m_Dictionary.ContainsKey(Key) Then
Return m_Dictionary(Key)
Else
Return [String].Empty
End If
End Get
Set(ByVal value As Object)
If m_Dictionary.ContainsKey(Key) Then
m_Dictionary(Key) = value
Else
m_Dictionary.Add(Key, value)
End If
End Set
End Property
Run Code Online (Sandbox Code Playgroud)
谢谢
最近我发现自己编写数据访问层选择方法,其中代码都采用这种通用形式:
public static DataTable GetSomeData( ... arguments)
{
string sql = " ... sql string here: often it's just a stored procedure name ... ";
DataTable result = new DataTable();
// GetOpenConnection() is a private method in the class:
// it manages the connection string and returns an open and ready connection
using (SqlConnection cn = GetOpenConnection())
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
// could be any number of parameters, each with a different type
cmd.Parameters.Add("@Param1", SqlDbType.VarChar, 50).Value …Run Code Online (Sandbox Code Playgroud) ?:在.net中是否有等效的运算符?例如在java中我可以这样做:
retParts[0] = (emailParts.length > 0) ? emailParts[0] : "";
Run Code Online (Sandbox Code Playgroud)
而不是
if (emailParts.length > 0) {
retParts[0] = emailParts[0];
} else {
retParts[0] = "";
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在VB.NET中做类似的事情.
假设我们有以下方法声明:
Public Function MyMethod(ByVal param1 As Integer, _
Optional ByVal param2 As Integer = 0, _
Optional ByVal param3 As Integer = 1) As Integer
Return param1 + param2 + param3
End Function
Run Code Online (Sandbox Code Playgroud)
VB.NET如何使可选参数在CLR的范围内工作?可选参数是否符合CLS?
除非我需要进行实际转换,否则我通常会避免使用VB的内置转换函数(CStr,CDate,CBool,CInt等).如果我只是在演员,从一个对象说到一个字符串,我通常使用DirectCast或TryCast,假设CStr等正在做一些我不需要的额外的东西.但有时DirectCast语法有点麻烦,如下例所示.
Dim value1 As String
Dim value2 As String
Using cn As New SqlConnection(cnStr)
Using cmd as New SqlCommmand(sqlStr, cn)
Using reader = cmd.ExecuteReader()
While reader.Read()
value1 = DirectCast(reader("COLUMN1"), String)
value2 = CStr(reader("COLUMN1"))
End While
End Using
End Using
End Using
Run Code Online (Sandbox Code Playgroud)
SqlDataReader.Item返回一个Object,需要将其强制转换为String.CStr更易于阅读,输入和解释(IMO).
我的问题是,我使用哪一个是否重要?我应该选择CStr(以及CDate和CBool等)而不担心我认为这些功能正在做的额外工作吗?
使用这些功能还有其他缺点吗?
当我在Form上有许多控件(即Label,Button等)做几乎相同的事情时,我经常使用一种方法来处理所有控件Click,MouseDown,MouseUp事件.
但要知道哪个控件抛出事件并访问该控件的属性,我需要将"sender"对象强制转换为正确的类型.
问题是我总是知道它是哪种类型,我不需要"TryCast","DirectCast"并检查操作是否返回true.我有时也使用CType.
Dim btn as Button = CType(sender, Button)
btn.Txt = "Pushed"
当我已经知道控件的类型时,我想找到最快的转换方法,我知道有一个Button事件调用我的方法,并且像将转发器对象转换为Button控件的最快方法.
有什么建议?
vb.net ×10
.net ×3
.net-2.0 ×1
c# ×1
casting ×1
cil ×1
clr ×1
designer ×1
gethashcode ×1
java ×1
late-binding ×1
performance ×1
properties ×1
string ×1
unicode ×1