VB.NET是否直接等效于C#out
函数参数,其中传递给函数的变量不需要初始化?
有没有办法在创建时可以将值插入到VB.NET字典中?我可以,但不想,为每个项目执行dict.Add(int,"string").
基本上,我想做"如何在实例化时将值插入C#Dictionary?" 用VB.NET.
var dictionary = new Dictionary<int, string>
{
{0, "string"},
{1, "string2"},
{2, "string3"}
};
Run Code Online (Sandbox Code Playgroud) 我需要检查给定对象是否实现了接口.在C#中,我只想说:
if (x is IFoo) { }
Run Code Online (Sandbox Code Playgroud)
是使用a TryCast()
然后检查Nothing
最好的方法?
在VB.NET中调试一个涉及初始化实例变量的顺序的特别棘手的问题之后,我发现我期望从C#开始的行为与VB.NET中的实际行为之间存在突破性差异.
Nota bene:这个问题涉及VB.NET和C#的行为略有不同.如果你是一个无法提供答案的语言偏执,而不是"这就是为什么你应该使用C#,noob",那么你在这里看不到任何东西; 和睦相处.
具体来说,我期望C#语言规范概述的行为(重点增加):
当实例构造函数没有构造函数初始化程序,或者它具有表单的构造函数初始值设定项时
base(...)
,该构造函数隐式执行由其类中声明的实例字段的变量初始值设定项指定的初始化.这对应于在进入构造函数之后和直接调用直接基类构造函数之前立即执行的赋值序列.变量初始值设定项以它们出现在类声明中的文本顺序执行.
与有关实例构造函数的VB.NET语言规范部分形成对比,该部分说明(强调添加):
当构造函数的第一个语句是表单时
MyBase.New(...)
,构造函数隐式执行由类型中声明的实例变量的变量初始值设定项指定的初始化.这对应于在调用直接基类型构造函数后立即执行的赋值序列.这样的排序可确保在执行有权访问实例的任何语句之前,所有基本实例变量都由其变量初始化程序初始化.
这里的差异立即显而易见.C#在调用基础构造函数之前初始化类级变量.VB.NET完全相反,显然更喜欢在设置实例字段的值之前调用基础构造函数.
如果你想看一些代码,这个相关的问题提供了一个更具体的例子,说明不同的行为.不幸的是,它没有提供关于如何强制VB.NET遵循C#建立的模型的任何提示.
我不太感兴趣为什么这两种语言的设计者选择这种不同的方法而不是我可能的问题解决方法.最后,我的问题如下:有没有办法在VB.NET中编写或构造我的代码,以便在调用基类型的构造函数之前强制实例变量初始化,这是C#中的标准行为?
对于这个问题:什么是C#相当于朋友?,我个人已回答"内部",就像Ja在答案中所做的那样!然而,Jon Skeet说在C#中没有直接等价的VB Friend.如果Jon Skeet这么说的话,我就不会这样说了!,P
我想知道当关键字internal(C#)各自的定义是什么时,它们怎么能不等同于Friend(VBNET):
声明语句中的Friend(Visual Basic)关键字指定可以从同一个程序集中访问元素,但不能从程序集外部访问.[...]
内部:访问仅限于当前程序集.
据我了解,这些定义对我来说意义相同.
然后,当我在VB.NET中编码时,我使用Friend关键字来指定只能在声明它的程序集中访问类或属性.在C#中,我使用internal关键字指定相同.
从这个角度来看,我做错了什么吗?
我没有得到什么改进?
有人可以解释一下朋友和内部是如何或不是直接对等的?
提前感谢您的任何答案!
首先,我希望自己编写一个针对底层Active Directory的操作的泛型类型.
对于那些了解AD和System.DirectoryServices命名空间的人来说,DirectoryEntry类与DirectorySearcher类一起是最重要的.
说到AD语言时,一切都是DirectoryEntry.话虽如此,我的应用程序需要管理用户,组和组织单位(OU).这些对象中的每一个都是AD条目.然后,这对我来说是GenericTypes的一个很好的候选者.
我想要完成的是:
public interface ITop {
string Path { get; set; }
string ObjectClass { get; }
string ContainerName { get; set; }
// [...]
}
public interface IGroup : ITop {
// Speciality properties here...
}
public interface IUser : ITop {
// Speciality properties here...
}
// And so forth...
public sealed class DirectorySource<T> where T : ITop {
// Methods against AD here...
} …
Run Code Online (Sandbox Code Playgroud) 什么是这个代码的VB.NET等价物..
public virtual ICollection<Comment> Comments { get; set; }
Run Code Online (Sandbox Code Playgroud) 出于好奇,再一次:
在VB.Net中编写了几个项目后,我惊讶地发现C#和VB.NET LINQ用法之间存在一些细微差别.例如,如果我们想要按多个属性(列)对元素进行分组,我们需要显式创建一个新的匿名类型:
var procs = from c in Process.GetProcesses()
group c by new {c.BasePriority, c.Id} into d
select d;
Run Code Online (Sandbox Code Playgroud)
而在VB.NET中,更直接的语法已经做到了:
Dim b = From c In Process.GetProcesses()
Group c By c.BasePriority, c.Id Into Group
Select Group
Run Code Online (Sandbox Code Playgroud)
因此,不需要在这里创建一个带有"new"的类型.
还有什么区别?C#和VB.NET中的LINQ语法有什么好的比较吗?
有没有办法在VB.NET中执行此操作,如在C风格的语言中:
struct Thickness
{
double _Left;
double _Right;
double _Top;
double _Bottom;
public Thickness(double uniformLength)
{
this._Left = this._Right = this._Top = this._Bottom = uniformLength;
}
}
Run Code Online (Sandbox Code Playgroud) 在c#中我可以在创建时初始化List
var list = new List<String>() {"string1", "string2"};
Run Code Online (Sandbox Code Playgroud)
在VB.Net中有类似的东西吗?目前我可以这样做
Dim list As New List(Of String)
list.Add("string1")
list.Add("string2")
list.Add("string3")
Run Code Online (Sandbox Code Playgroud)
但我想避免无聊.添加线条
c#-to-vb.net ×10
vb.net ×8
c# ×4
.net ×2
.net-2.0 ×1
c++ ×1
constructor ×1
dictionary ×1
generics ×1
keyword ×1
linq ×1
list ×1
vb.net-to-c# ×1