所以有时我想只从命名空间而不是整个命名空间中包含一个类,比如这里的例子我用using语句创建了该类的别名:
using System;
using System.Text;
using Array = System.Collections.ArrayList;
Run Code Online (Sandbox Code Playgroud)
我经常用泛型做到这一点,所以我不必重复这些论点:
using LookupDictionary = System.Collections.Generic.Dictionary<string, int>;
Run Code Online (Sandbox Code Playgroud)
现在我想用泛型类型完成相同的操作,同时将其保留为泛型类型:
using List<T> = System.Collections.Generic.List<T>;
Run Code Online (Sandbox Code Playgroud)
但是这不能编译,那么有什么方法可以实现创建这个别名,同时将类型保留为通用类型?
我仍然受到WinForm UI中背景线程的困扰.为什么?以下是一些问题:
我正在寻找这个问题的优雅解决方案,但在我了解我正在寻找的具体内容之前,我想我会澄清问题.这是为了解决一般性问题并在其背后提出一个更具体的例子.对于这个例子,假设我们正在通过互联网传输大量数据.用户界面必须能够显示正在进行的传输的进度对话框.进度对话框应该持续快速更新(每秒更新5到20次).用户可以随时关闭进度对话框,并在需要时再次调用它.而且,让我们假装参数,如果对话框可见,它必须处理每个进度事件.用户可以单击进度对话框上的取消,并通过修改事件参数,取消操作.
现在我需要一个适合以下限制条件的解决方案:
那么,鉴于上述限制,这可以解决吗?我搜索并挖掘了无数的博客和讨论,唉,我还是空手而归.
更新:我确实意识到这个问题没有简单的答案.我只在这个网站上呆了几天,我见过一些有很多回答问题经验的人.我希望这些人中的一个能够充分解决这个问题,这样我就不会花费一周时间来建立一个合理的解决方案.
更新#2:好的,我将尝试更详细地描述问题,看看有什么(如果有的话)震动.允许我们确定其状态的以下属性引起了一些问题...
Control.InvokeRequired =记录如果在当前线程上运行或者IsHandleCreated为所有父项返回false,则返回false.我很担心InvokeRequired实现有可能抛出ObjectDisposedException或甚至可能重新创建对象的句柄.并且由于InvokeRequired在我们无法调用(正在进行Dispose)时可以返回true,并且它可以返回false,即使我们可能需要使用invoke(正在创建),这在所有情况下都不可信任.唯一可以看到我们可以信任的地方InvokeRequired返回false是当IsHandleCreated在调用之前和之后都返回true时(BTW,InvokeRequired的MSDN文档确实提到了对IsHandleCreated的检查).
Control.IsHandleCreated =如果已为控件分配了句柄,则返回true;否则返回true.否则,错误.虽然IsHandleCreated是一个安全的调用,但如果控件正在重新创建它的句柄,它可能会崩溃.这个潜在的问题似乎可以通过在访问IsHandleCreated和InvokeRequired时执行锁定(控制)来解决.
Control.Disposing =如果控件处于处理过程中,则返回true.
......我的头疼了:(希望上面的信息可以为那些遇到这些麻烦的人提供更多的解决方案.我很感激你的思考周期.
关闭麻烦......以下是Control.DestroyHandle()方法的后半部分:
if (!this.RecreatingHandle && (this.threadCallbackList != null))
{
lock (this.threadCallbackList)
{
Exception exception = new ObjectDisposedException(base.GetType().Name);
while (this.threadCallbackList.Count > 0)
{
ThreadMethodEntry entry = (ThreadMethodEntry) this.threadCallbackList.Dequeue();
entry.exception = exception;
entry.Complete();
}
}
}
if ((0x40 & ((int) ((long) UnsafeNativeMethods.GetWindowLong(new …Run Code Online (Sandbox Code Playgroud) 所以这就是问题的关键:Foo.Bar可以返回null吗?为了澄清,'_bar'在被评估为非null并且在返回值之前可以设置为null吗?
public class Foo
{
Object _bar;
public Object Bar
{
get { return _bar ?? new Object(); }
set { _bar = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我知道使用以下get方法不安全,并且可以返回null值:
get { return _bar != null ? _bar : new Object(); }
Run Code Online (Sandbox Code Playgroud)
更新:
另一种看待同一问题的方法,这个例子可能更清楚:
public static T GetValue<T>(ref T value) where T : class, new()
{
return value ?? new T();
}
Run Code Online (Sandbox Code Playgroud)
并再次询问GetValue(...)是否会返回null?根据你的定义,这可能是也可能不是线程安全的...我猜正确的问题陈述是询问它是否是一个关于价值的原子操作...... David Yaw已经通过说上面的函数等效来定义问题了以下内容:
public static T GetValue<T>(ref T value) where T : class, new()
{
T result = value;
if …Run Code Online (Sandbox Code Playgroud) 好的,我希望整个社区能够帮助我们解决一段时间以来一直在进行的工作场所辩论.这与定义接受或返回某种类型列表的接口有关.有几种方法可以做到这一点:
public interface Foo
{
Bar[] Bars { get; }
IEnumerable<Bar> Bars { get; }
ICollection<Bar> Bars { get; }
IList<Bar> Bars { get; }
}
Run Code Online (Sandbox Code Playgroud)
我自己的偏好是使用IEnumerable作为返回值的参数和数组:
public interface Foo
{
void Do(IEnumerable<Bar> bars);
Bar[] Bars { get; }
}
Run Code Online (Sandbox Code Playgroud)
我对这种方法的论点是,实现类可以直接从IEnumerable创建一个List,并简单地使用List.ToArray()返回它.但是有些人认为应该返回IList而不是数组.我在这里遇到的问题是,现在你需要再次使用ReadOnlyCollection复制它,然后再返回.返回IEnumerable的选项对于客户端代码来说似乎很麻烦?
你喜欢/喜欢什么?(特别是关于将由组织外部的其他开发人员使用的库)
前言
一段时间以来,我一直在几乎所有类字段中使用readonly修饰符.我将它用于List <T>成员,IDisposeable成员,整数,字符串等......除了我打算改变的值类型之外的所有东西.即使我通常想在Dispose()上取消成员,我也倾向于这样做.恕我直言不需要if语句来测试null或处理条件的优点大大超过了"可以"多次处理的对象中的"潜在"问题.
问题
你什么时候使用readonly,或者是吗?
您或您的公司是否有关于readonly使用的最佳实践和/或编码标准?
我很想听听你对以下样本课的看法,一般概念是不是很好的做法?
class FileReaderWriter : IFileReaderWriter, IDisposable
{
private readonly string _file;
private readonly Stream _io;
public FileReaderWriter(string path)
{
_io = File.Open(_file = Check.NotEmpty(path), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
}
public void Dispose() { _io.Dispose(); }
...
}
Run Code Online (Sandbox Code Playgroud) 所以,我不希望它在C#和VB.NET开发人员之间陷入激烈的争斗.这纯粹是从开发部门的角度出发.我们多年来一直是VB.NET公司,但这主要归功于我们雇用的人.由于我们已经吸引了2位专攻C#的人,因此这项要求已经不再适用了.在转换为VB.NET之前,我曾经是一名C++/C#人员.
因此,对于每个必须处理此问题的人来说,无论是在招聘基础上还是在可维护性基础上:您如何处理未来选择的标准化语言?我倾向于推动C#,因为这将使3个坚实的C#开发人员在这里.但只是好奇每个人对此的看法.
所以这是迄今为止的故事,我有这个工作者,它使用AppDomain来执行某些任务.该域名设置和拆卸都很昂贵.所以我为工作者创建一个WeakReference对象的每个线程缓存,如下所示:
class Worker
{
[ThreadStatic]
static Dictionary<string, WeakReference> _workers;
public static Worker Fetch( ... ) { you get the idea }
private AppDomain _domain;
public Worker(...)
{
_domain = AppDomain.Create( ... );
}
~Worker()
{
AppDomain.Unload(_domain);
}
// bla bla bla
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当GC收集时,似乎总是在调用AppDomain.Unload时引发异常:
System.CannotUnloadAppDomainException: Error while unloading appdomain. (Exception from HRESULT: 0x80131015)"
Run Code Online (Sandbox Code Playgroud)
所以我觉得这很奇怪,我知道我在那个领域没有任何"跑步"......这笔交易是什么?我想出了一点挖掘和反复试验:
~Worker()
{
new Action<AppDomain>(AppDomain.Unload)
.BeginInvoke(_domain, null, null);
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
(主观)
我正在寻找您在应用程序中执行日志记录的用途.这个log4net让我很头疼.有没有更好的答案或者只是自制的解决方案?我知道System.Diagnostics.Trace子系统非常有能力我应该分层吗?
可能重复:
确定两个路径引用C#中同一文件的最佳方法
所以我需要比较两个Windows文件名,以确定它们是否相同.一个用户给了我,一个给了我另一个程序.那么你应该如何比较:
C:\Program Files\Application1\APP.EXE C:\Progra~1\Applic~1\APP.EXE C:\program files\applic~1\app.exe
我似乎无法找到一种方法来始终"规范化"路径,我尝试使用Path.GetFullPath(路径)和新的FileInfo(路径).FullName,似乎都没有解决这个问题.
更新:
Path.GetFullPath(path)将更正短到长名称转换但不会规范化大小写.因此需要StringComparer.OrdinalIgnoreCase.Equals(path1,path2).
因此NTFS使用128位Guid来识别文件和目录,您可以轻松地查看此信息:
C:\Temp>C:\Windows\System32\fsutil.exe objectid query . Object ID : ab3ffba83c67df118130e0cb4e9d4076 BirthVolume ID : ca38ec6abfe0ca4baa9b54a543fdd84f BirthObjectId ID : ab3ffba83c67df118130e0cb4e9d4076 Domain ID : 00000000000000000000000000000000
所以这很明显,但是如何以编程方式检索这些信息呢?查看OpenFileById(...)的WinApi,您应该能够获得此信息.可以预期这将在" Win32 FileID API库 "中完成,但那里的方法(GetFileInformationByHandleEx)返回FILE_ID_BOTH_DIR_INFO结构.这个结构定义了一个FileId; 但是,它是一个LARGE_INTEGER(64位)而不是完整的128位标识符.
我猜可以使用WMI,这是我应该转向的地方吗?