在Visual Studio中创建新的.net框架4.5.2项目时,有没有办法在默认情况下使用新样式csproj(使用SDK,PackageReferences,并且不需要使用编译包含等)?
目前我正在创建一个.net标准项目,然后将其更改为.net 4.5.2,或者只是手动更改csproj,但即使这不是那么慢,我宁愿它会自动发生.
老式 :
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
...
Run Code Online (Sandbox Code Playgroud)
新风格:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net452</TargetFramework>
...
Run Code Online (Sandbox Code Playgroud) 我正在寻找关于如何继续使用C++构建的类层次结构的建议.
基类是Matrix:
class Matrix
{
protected:
int rows;
int columns;
double* values;
public:
\\lots of stuff goes here. bla di bla di bla.
virtual Matrix operator+(const Matrix& addend) const;
\\etc.
}
Run Code Online (Sandbox Code Playgroud)
Squarematrix继承自Matrix
class Squarematrix : public Matrix
{
public:
Squarematrix operator+(const Squarematrix& addend) const;
}
Run Code Online (Sandbox Code Playgroud)
Operator +分别返回矩阵或squarematrix.由于operator +是一个虚函数,因此它不能编译,因为它必须在所有类中具有相同的返回类型.
那么我的选择是什么?
我可以使用普通函数而不是虚函数.这有点烦人,但在大多数情况下都不会引起问题.
在所有情况下我都可以返回一个矩阵.这基本上会使我的squarematrix类在***中使用正确的痛苦,因为我必须不断地从矩阵转向squarematrix.
我可以返回对squarematrix的引用.然后矩阵必须存储在堆上,并且无法确保将其安全删除.特别是如果我做这样的事情:
squarematrix a=b+(c+d);
Run Code Online (Sandbox Code Playgroud)
(c + d)将存储在堆上,并且没有指向它的指针,因此将被泄露.
有没有办法保持虚函数,但仍然有不同的返回类型?
在这种情况下你会提出什么建议?
谢谢你的帮助.期待您的回音.
在http://source.roslyn.io/#System.Collections.Immutable/System/Collections/Immutable/ImmutableArray.cs上查看ImmutableArray的源代码
public static ImmutableArray<T> Create<T>(params T[] items)
{
if (items == null)
{
return Create<T>();
}
// We can't trust that the array passed in will never be mutated by the caller.
// The caller may have passed in an array explicitly (not relying on compiler params keyword)
// and could then change the array after the call, thereby violating the immutable
// guarantee provided by this struct. So we always copy the array to ensure it won't …Run Code Online (Sandbox Code Playgroud) 如果您有异步功能:
public async Task DoWork()
{
await DoSomeWorkAsync();
await DoSomeMoreWorkAsync();
}
Run Code Online (Sandbox Code Playgroud)
现在第一个await阻止了阻塞调用上下文的方法,因此很有用.
但是在DoSomeWorkAsync完成之后,该方法无论如何都在不同的上下文中运行,因为在编译器中它被转换为类似的东西Task.ContinueWith(await DoSomeMoreWorkAsync()).
他们等待DoSomeMoreWorkAsync/运行异步的任何目的是什么?有什么缺点吗?DoSomeMoreWorkAsync如果它存在,我应该使用非异步版本吗?
即.这会不会有任何不利之处:
public async Task DoWork()
{
await DoSomeWorkAsync();
DoSomeMoreWork();
}
Run Code Online (Sandbox Code Playgroud)
编辑:这与单个方法中的Multiple Awaits不同.那询问会发生什么.我在问这件事有什么好处.
其中一个优点linq.Any()是,一旦返回第一个结果,它就会短路,O(1)也不是O(n).
如果我想检查Linq.Count() > nwhere n> 1,那么短路表达式的最佳方法是什么,这样当Linq.Count()接近n时它不会显着减慢速度,但是当Linq.Count加快速度时()很大.
我想将 an 转换Either[A, B]为选项,这样 if Eitheris Leftit is Some[A],如果 it is Rightit is None。
到目前为止我已经想出了
either.swap.map(Some(_)).getOrElse(None)
Run Code Online (Sandbox Code Playgroud)
这有点拗口。
和
either match {
case Left(value) => Some(value)
case Right(_) => None
}
Run Code Online (Sandbox Code Playgroud)
这很好,但理想情况下我想知道是否有更惯用的方法使用方法而不是显式匹配。
我想检查两个列表是否包含相同的项目。项目的顺序并不重要,相同的项目可能会在每个列表中出现两次。
例如:
var List1 = new List<int> { 1, 2, 2 };
var List2 = new List<int> { 2, 1, 2 };
//equal
var List1 = new List<int> { 1, 2, 2 };
var List2 = new List<int> { 2, 1, 1 };
//not equal - different quantities of 1s and 2s in the two lists
Run Code Online (Sandbox Code Playgroud)
目前我按如下方式执行此操作:
var List2copy = List2.ToList();
if (List1.Count != List2.Count) return false;
return List1.All(x => List2copy.Remove(x));
Run Code Online (Sandbox Code Playgroud)
然而现在我需要IEqualityComparer对这两个项目使用 an ,这是Remove不能接受的。谁能想到一个有效的解决方案来解决这个问题?IEnumerable如果它接受一个而不是一个,它也会很有用 …
我正在尝试以编程方式从 nuget 包中提取 dll 并在运行时加载 dll。
我想避免使用任何命令行工具 - 我希望我的程序完全独立,而不依赖外部可执行文件。
我正在尝试使用https://www.nuget.org/profiles/nuget上列出的各种 nuget.client nuget 包,但没有任何文档,我无法弄清楚如何使用。
我有 nupkg,我可以通过 PackageReader 计算出 nupkg 中 dll 的位置,但我不知道如何提取 nupkg 以便我可以取出文件。
编辑
感谢那些指出 nupkg 只是一个 zip 的人。我现在已经完成了以下操作:
var archive = new ZipArchive(downloadResourceResult.PackageStream);
var entry = archive.GetEntry(dllPath);
var assemblyLoadContext = new System.Runtime.Loader.AssemblyLoadContext(null, isCollectible: true);
var assembly = assemblyLoadContext.LoadFromStream(entry.Open());
Run Code Online (Sandbox Code Playgroud)
但是,这会引发 NotSupportedException 并带有以下堆栈跟踪
System.IO.Compression.DeflateStream.get_Length() at System.Runtime.Loader.AssemblyLoadContext.LoadFromStream(Stream assembly, Stream assemblySymbols) at System.Runtime.Loader.AssemblyLoadContext.LoadFromStream(Stream assembly)
Run Code Online (Sandbox Code Playgroud) scala 中的嵌套函数可以捕获父函数中的变量。
例如
def outer = {
var a = 0
def inner = {
a = 42
}
inner()
a
}
Run Code Online (Sandbox Code Playgroud)
在 C# 中,这是通过将所有捕获的变量存储在一个结构体上并在 byref 中传递该结构体来实现的。这避免了嵌套函数分配,除非您将其转换为函数对象。在sharplab中看到这个例子。
然而,在 scala 中,您不能通过 ref 传递变量,因此唯一可行的方法是将所有捕获的变量存储在一个对象上,然后传入该对象。
这是否意味着嵌套函数的每次调用都会在它捕获 scala 中的任何变量时进行分配?
目前我知道的将字符串的第一个字母大写的最快方法如下:
var array = str.ToCharArray();
array[0] = char.ToUpper(array[0]);
return new string(array);
Run Code Online (Sandbox Code Playgroud)
这涉及 2 个数组分配:char.ToUpper(array[0])以及复制到new string(array).
因为我知道array不能逃避这个方法,有没有办法使用不安全的代码来避免第二次分配?
我正在实现一个编译器,我需要将源代码文件中编写的转义字符文字转换为实际值。
例如,我可能会有一行源代码char = '\\'。然后我解析它并得到字符串"'\\'",我需要将其转换为实际的char '\\'。
char.Parse并且char.TryParse当以转义序列形式解析char时,两者均失败。例如:
char.Parse(@"\\");
Run Code Online (Sandbox Code Playgroud)
将抛出“字符串必须正好一个字符长”。
有什么方法可以将列表中的所有内容都解析为一个字符(忽略那些太大以适合UTF16字符的字符)。
C#的标准库目前有一个Char.IsSymbol方法在这里.
有没有人有任何建议如何实现Char.IsCurrencySymbol方法?
Char.IsCurrencySymbol('$')
// true
Char.IsCurrencySymbol('@')
//false
Run Code Online (Sandbox Code Playgroud) c# ×9
linq ×2
scala ×2
async-await ×1
asynchronous ×1
c++ ×1
closures ×1
csproj ×1
either ×1
inheritance ×1
matrix ×1
nuget ×1
optimization ×1
return-type ×1
scala-option ×1
unicode ×1
unsafe ×1