我有一个需要在STA公寓状态下运行的功能.我不想检查它是否作为STA运行,如果没有生成一个在STA中运行的新线程.
如何检查当前线程运行的公寓状态?
背景:我想创建一个自定义VB编译器,扩展"原始"编译器,以处理我的自定义编译时属性.
问题:在我创建自定义编译器并且我有一个能够通过标准命令行界面编译VB代码的可执行文件后,如何将此编译器与Visual Studio IDE集成?(这样按"编译"或"构建"将使用我的编译器而不是默认编译器).
编辑 :(如果我错了,请纠正我)
从这里的反应来看,我认为这个问题有点令人震惊,所以我将进一步解释我的需求和背景:.NET为我们提供了一个名为Attributes的强大机制.据我所知,使属性将其预期行为应用于属性元素(程序集,模块,类,方法等) - 必须反映属性.所以这里的真正诀窍是在正确的位置反映和应用行为.
让我们以Serialization为例:我们使用Serializable属性修饰一个类.然后,我们将类的实例传递给formatter的Serialize方法.格式化程序反映实例,检查它是否具有Serializable属性,并相应地执行操作.
现在,如果我们检查Synchronization,Flags,Obsolete和CLSCompliant属性,那么真正的问题是:谁反映了它们?至少在某些情况下,它必须是编译器(和/或IDE).因此,似乎如果我希望创建自定义属性来更改元素的行为而不管任何特定的使用者,我必须扩展编译器以在编译时反映它们.
当然,这些不是我个人的见解:书籍" Applied .NET Attributes "提供了一个完整的例子,用于创建自定义属性和自定义C#编译器,以便在编译时反映该属性(该示例用于实现"java-style"检查异常").
好吧,如果我创建一个单例类并通过公共静态属性公开单例对象......我明白了.
但我的单例类中还有其他属性.那些应该是静态的吗?这些也应该是私人的?
我只想通过这样做来访问我的单例类的所有属性:
MySingletonClass.SingletonProperty.SomeProperty2
Run Code Online (Sandbox Code Playgroud)
SingletonProperty返回单个单例实例.我想我的问题是,如何在单例类中公开其他属性..将它们设为私有,然后通过公共单例静态属性访问它们?
或者,单身人士的所有其他属性和方法是否应该是公共非静态的?
简单的问题来自一个简单的问题:ShadowsVB.NET中的New关键字和C#中的关键字有什么区别?(关于方法签名当然).
ReadOnlyCollection(T)的文档指出:
A ReadOnlyCollection(Of T)只要不修改集合,就可以同时支持多个读者.即便如此,通过集合枚举本质上不是一个线程安全的过程.为了在枚举期间保证线程安全,您可以在整个枚举期间锁定集合.要允许多个线程访问集合以进行读写,您必须实现自己的同步.
我的问题是关于粗体部分:
我想用Python计算希伯来日期(主要是当前的希伯来日期).哪个库成熟,易于使用并记录在案?我注意到这些.可能还有其他人.
某些预定义方法在其签名中包含ParamArray.但是,代表在签名中不能包含ParamArray.
问题:假设您希望为需要ParamArray的特定方法创建委派机制.你会如何解决这个约束?
编辑:只是为了说清楚,假设你不能改变方法签名本身(预定义的方法,由一些第三方定义,无论是否微软).
EDIT2:这里真正的优点是保持语法糖,因为以下代码确实有效,但消除了糖:
Public Delegate Sub MyDelegate(ByVal myArgs() As Object)
Public Sub PredefinedSub(ByVal ParamArray myArgs() As Object)
'...'
End Sub
Sub Test()
Dim aDelegate As New MyDelegate(AddressOf PredefinedSub)
aDelegate.Invoke(New Object() {1, 2, 3, 4})
End Sub
Run Code Online (Sandbox Code Playgroud)
EDIT3:事实证明,Skeet的解决方案也适用于创建包含ParamArray的事件和操作符.
假设如下:我们有B类,它是嵌套在A类中的私有类.没有任何继承自B类的类.问题是:编译器会自动将B类标记为Sealed吗?(在VB中不可继承).编译器是否有任何理由不将B类标记为密封?
我的想法是这样的:因为B类嵌套在A类中并且是私有的,并且没有其他类继承自B类,所以密封它应该是安全的,因为它不能在A类之外继承(不是甚至通过A)的子类.
Class A
Private Class B
End Class
End Class
Run Code Online (Sandbox Code Playgroud) 我的VB.NET(3.5)应用程序生成Excel报告。
较新版本的Excel支持Office Open XML文件格式,而较旧版本则不支持。
我希望我的应用程序确定本地计算机上安装了哪个版本的Excel,并使用另一种方法生成报告(较新版本:通过生成XML文件;较旧版本:通过利用Excel Automation)。
如何识别本地计算机上安装的Excel版本?
听起来很简单,但它不起作用.在这个例子中,我想将3个字段的值设置为等于4.我可以做这样的事......
Dim str1 As String = "1"
Dim str2 As String = "2"
Dim str3 As String = "3"
Dim str4 As String = "4"
str2 = str1
str3 = str1
str4 = str1
Run Code Online (Sandbox Code Playgroud)
......但这有点罗嗦(是的,我知道,在大多数情况下,vb是罗嗦的).我想有一些东西可以用来将它减少到一个单行调用,所以我做了这个扩展方法.
Module Module1
Sub Main()
Dim str1 As String = "1"
Dim str2 As String = "2"
Dim str3 As String = "3"
Dim str4 As String = "4"
Console.WriteLine("Extension method return value = {0}", str1.SetEqual(str2, str3, str4))
Console.WriteLine("String 1 = {0}", str1)
Console.WriteLine("String 2 = …Run Code Online (Sandbox Code Playgroud) .net ×6
vb.net ×4
c# ×3
paramarray ×2
byref ×1
calendar ×1
cil ×1
compilation ×1
concurrency ×1
date ×1
datetime ×1
delegates ×1
excel ×1
hebrew ×1
immutability ×1
new-operator ×1
optimization ×1
parameters ×1
python ×1
sealed ×1
shadows ×1
singleton ×1
sta ×1