我注意到,在今天使用某些LinQ函数测试性能差异时,它LastOrDefault(predicate)几乎总是比快FirstOrDefault(predicate),这引起了我一些兴趣,因此我编写了一些测试用例,以对两个函数进行相互测试。
我创建了一个integer从1到100万的值列表,如下所示:
List<int> l = new List<int>();
for (int i = 1; i <= 1000000; i++)
{
l.Add(i);
}
Run Code Online (Sandbox Code Playgroud)
然后写了2种方法first()和last()
static void first(List<int> l)
{
int e = l.FirstOrDefault(x => x == 500000);
int z = l.FirstOrDefault(x => x == 500000);
int d = l.FirstOrDefault(x => x == 500000);
int v = l.FirstOrDefault(x => x == 500000);
int f = l.FirstOrDefault(x => x == 500000);
}
Run Code Online (Sandbox Code Playgroud)
我在for循环中运行了1000次,在最后一次迭代后设置断点,条件是暂停,但是在我测试的每个单例情况下,LastOrDefault速度都更快。
我的项目中有一个单例,如下所示:
//Create a Singleton
static MySingleton Instance;
private static readonly object Padlock = new object();
/// <summary>
/// Singelton Method, to make sure only one instance of this class exists at runtime.
/// </summary>
/// <returns></returns>
public static MySingleton GetInstance()
{
//Thread Safety
lock (Padlock)
{
if (Instance == null)
{
Instance = new MySingleton();
}
return Instance;
}
}
private MySingleton()
{
}
//[...]
Run Code Online (Sandbox Code Playgroud)
Singleton 包含几个其他类作为 Properties,它们永远不应该为 null。
通常我会使用DependencyInjection来保证每个新对象在实例化时获得所有必要的参数。像这样:
IHelperClass Helper {get; set;}
IExectiveClass Executive {get; set;} …Run Code Online (Sandbox Code Playgroud) 免责声明:这是.Net Framework特有的问题,在 .Net Core 中不会发生。
我目前正在开发一个项目,该项目作为一个更大项目的插件。我想将项目的输出路径设置到较大项目的 AddIn 文件夹,然后使用项目的调试属性启动较大的项目,这样我就不必每次都手动复制并附加到项目。
我拥有的任何参考都是与较大的项目共享并从其管理的,这意味着我没有(也不应该)将它们复制到 AddIn 文件夹。
我将此答案中的代码包含到我的 .csproj (VS 19/新格式)
<ItemDefinitionGroup>
<Reference>
<Private>False</Private>
</Reference>
<ProjectReference>
<Private>False</Private>
</ProjectReference>
</ItemDefinitionGroup>
Run Code Online (Sandbox Code Playgroud)
排除项目和常规引用,但在 .Net Framework 中,我的 Nuget 包中的所有.dll也会复制到输出路径。我也在寻找一种方法来禁用它,但还没有找到。
有没有办法阻止Nuget 包中的.dll被复制到 .Net Framework 中的输出路径?
我目前正在开发一个项目,该项目应该作为多个附加组件的框架工作,这些附加组件应该在运行时加载。
我的任务是在我的应用程序文件夹中具有以下结构:
System.Windows.Interactivity.dll)我知道加载附加组件时的子文件夹和文件名,因此我只需使用Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location))和Path.Combine()构建 .dll 的路径,然后Assembly.LoadFile()在使用反射之前加载它assembly.GetExportedTypes()以找到为我的“EntryPointBase”继承的类,然后用Activator.CreateInstance().
但是,只要我的附加组件中有任何引用,System.IO.FileNotFoundException就会弹出一个针对该引用的目标assembly.GetExportedTypes()
我构建了一个方法来加载所有引用的程序集,甚至递归地从引用加载所有引用,如下所示:
public void LoadReferences(Assembly assembly)
{
var loadedReferences = AppDomain.CurrentDomain.GetAssemblies();
foreach (AssemblyName reference in assembly.GetReferencedAssemblies())
{
//only load when the reference has not already been loaded
if (loadedReferences.FirstOrDefault(a => a.FullName == reference.FullName) == null)
{
//search in all subfolders
foreach (var location in Directory.GetDirectories(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)))
{
//GetDirectoriesRecusrive searchs all …Run Code Online (Sandbox Code Playgroud)