几周前,我发现C#中的字符串被定义为引用类型而不是值类型.最初我对此感到困惑,但经过一些阅读后,我突然明白了为什么将字符串存储在堆而不是堆栈上是很重要的 - 因为将一个非常大的字符串复制到一个不可预测的数字上是非常低效的堆栈帧.我完全接受这个.
我觉得我的理解几乎已经完成,但是我缺少一个元素 - 字符串用什么语言来保持它们不变?用代码示例来说明:
string valueA = "FirstValue";
string valueB = valueA;
valueA = "AnotherValue";
Assert.AreEqual("FirstValue", valueB); // Passes
Run Code Online (Sandbox Code Playgroud)
当我将valueA分配给valueB时,我不明白哪个语言功能会复制valueA.或者,当我将valueA赋值给valueB时,对valueA的引用不会改变,只有valueA在设置字符串时才会获得对自身的新引用.由于这是一个实例类型,我不明白为什么这样做.
我知道你可以重载,例如,==和!=运算符,但我似乎找不到有关重载=运算符的任何文档.解释是什么?
我一起使用Nancy和Razor来构建我的网络应用程序.我能够提供Razor视图,它们显示完全正常.但是,尽管根本没有运行时错误,Visual Studio 2015几乎在我的.cshtml文件的每一行都报告错误:

我看到的具体错误是:
我相信我已根据文档正确配置了我的app.config :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
<section name="razor" type="Nancy.ViewEngines.Razor.RazorConfigurationSection, Nancy.ViewEngines.Razor" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key="webPages:Enabled" value="false" />
</appSettings>
<system.web.webPages.razor>
<pages pageBaseType="Nancy.ViewEngines.Razor.NancyRazorViewBase">
<namespaces>
<add namespace="Nancy.ViewEngines.Razor" />
</namespaces>
</pages>
</system.web.webPages.razor>
<razor disableAutoIncludeModelNamespace="false">
<assemblies>
<add …Run Code Online (Sandbox Code Playgroud) 我在使用泛型时理解多态如何工作时遇到了问题.举个例子,我定义了以下程序:
public interface IMyInterface
{
void MyMethod();
}
public class MyClass : IMyInterface
{
public void MyMethod()
{
}
}
public class MyContainer<T> where T : IMyInterface
{
public IList<T> Contents;
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做,这很好用:
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
Run Code Online (Sandbox Code Playgroud)
我有很多实现MyInterface的类.我想编写一个可以接受所有MyContainer对象的方法:
public void CallAllMethodsInContainer(MyContainer<IMyInterface> container)
{
foreach (IMyInterface myClass in container.Contents)
{
myClass.MyMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想称之为这种方法.
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
this.CallAllMethodsInContainer(container);
Run Code Online (Sandbox Code Playgroud)
那没用.当然,因为MyClass实现了IMyInterface,我应该能够实现它吗?
MyContainer<IMyInterface> newContainer = (MyContainer<IMyInterface>)container;
Run Code Online (Sandbox Code Playgroud)
那也行不通.我绝对可以将一个普通的MyClass转换为IMyInterface:
MyClass newClass = new MyClass();
IMyInterface myInterface = (IMyInterface)newClass;
Run Code Online (Sandbox Code Playgroud)
所以,至少我没有完全误解这一点.我不确定我是如何编写一个接受符合相同接口的类的泛型集合的方法. …
我在Visual Studio 2010的对象浏览器中查看一个抽象类.我想找到所有来自这个抽象类的类,以便我可以选择在我的应用程序中实现的最佳类.我没有此程序集的源代码,因此我无法使用find in files功能.
不幸的是,我似乎无法找到如何做到这一点.Visual Studio文档和谷歌只返回完全无关的文章,所以我使用的是错误的术语,或者这个功能根本不存在.
我收到的最好建议是"用红门反射器分析装配",但肯定有更好的方法.
感谢您的时间.
我从此调用TimeSpan.ParseExact收到FormatError异常,但我正在阅读的MSDN文档说这种格式应该是正确的:
TimeSpan timeSpan = TimeSpan.ParseExact("172100", "HHmmss", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我为什么这不起作用?我通过调用DateTime.ParseExact来做几乎完全相同的事情,这很好用:
DateTime datetTime = DateTime.ParseExact("090820", "yyMMdd", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud) 我试图在Link SDK only模式下使用MonoTouch编译我的iOS应用程序.如果我完全关闭链接它会完全编译,但它也产生一个巨大的二进制文件,不适合发布模式.
不幸的是,我需要的某个库以某种方式调用Expression.Visit,我无法弄清楚如何指示链接器不将其剥离.这会导致此编译错误:
错误MT2002:无法从"System.Core,Version = 2.0.5.0,Culture = neutral"解析"System.Linq.Expressions.Expression System.Linq.Expressions.ExpressionVisitor :: Visit(System.Linq.Expressions.Expression)"引用,PublicKeyToken = 7cec85d7bea7798e"(MT2002)(MyApp)
根据自定义链接的文档,我设置了一个链接器文件来尝试阻止这种情况发生:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor">
<method signature="System.Linq.Expressions.Expression Visit(System.Linq.Expressions.Expression)" />
</type>
</assembly>
</linker>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有任何影响 - 错误就像以前一样发生.
文档提到了preserve="fields"我可以提供的参数<type>,所以我尝试了:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor" preserve="methods" />
</assembly>
</linker>
Run Code Online (Sandbox Code Playgroud)
那也行不通.
然后我在文件中引入了XML语法错误,并且构建失败,说它无法解析链接器文件,因此我至少知道正在读取该文件.
但后来我尝试在程序集名称中引入错误:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="NonexistentAssembly">
</assembly>
</linker>
Run Code Online (Sandbox Code Playgroud)
这引起了一个错误,抱怨组装无法解决.
然后我试图破坏类型名称:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="NonExistentType" preserve="methods" />
</assembly> …Run Code Online (Sandbox Code Playgroud) 由于最初的TestFlight应用程序将在一个月内退役,我正试图掌握iTunes Connect Beta系统,这看起来是一项重大改进.按照指示,我重新生成了我的配置文件,并在我的构建服务器上重新加载它们.
然后我使用"AppStore | Release"配置文件执行构建,我在日志中看到了这条消息:
codesign -v -f -s"XXXXXX"" - resources-rules =/.../MyApp.app/ResourceRules.plist"--entitlements"/../ iSnagMobileiOS.xcent""/../ iSnagMobileiOS.app "
entitlements参数中指定的文件包含预期的beta-reports-active键:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>get-task-allow</key>
<false/>
<key>application-identifier</key>
<string>XXXXXXX.com.mycompany.myapp</string>
<key>com.apple.developer.team-identifier</key>
<string>XXXXXXXX</string>
<key>beta-reports-active</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>XXXXX.com.mycompany.myapp</string>
</array>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
然后,我检索了生成的IPA,该IPA是使用我的分发证书签署的.为了检查是否已应用了正确的权利,我执行了此命令以检查配置文件:
unzip -p MyApp.ipa Payload/MyApp.app/embedded.mobileprovision | 安全cms -D
在XML片段中,我可以看到包含预期标志的权利字典:
<key>Entitlements</key>
<dict>
<key>keychain-access-groups</key>
<array>
<string>XXXXXXXX.*</string>
</array>
<key>get-task-allow</key>
<false/>
<key>application-identifier</key>
<string>XXXXXXXX.com.mycompany.myapp</string>
<key>com.apple.developer.team-identifier</key>
<string>XXXXXXXXX</string>
<key>beta-reports-active</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
在IPA中也没有额外的Entitlements.plist文件可能会将其丢弃.
我使用Application Loader 3.0上传了IPA,但之后收到了此错误消息:
警告:ITMS-90191:"缺少测试版权利.您的应用程序不包含beta-reports-active授权.如果您打算通过TestFlight分发此版本进行beta测试,请使用新生成的配置文件重新构建此应用程序. "
我在搜索这条消息时发现了很多点击,但似乎都没有描述上面的问题; 所有这些用户都发现重新生成配置文件并再次下载它就是所需要的.
我想知道我是否遇到了由旧版XCode或MonoTouch引起的问题,但在我更新了两者之后,我仍然遇到了同样的问题.我猜这个问题不是由Xamarin引起的,但可能是由我在构建配置中忽略的设置引起的,但我可能在那里错了.
我有一个自动扩展组,它启动队列处理实例.这些实例基于Windows.通常我们只需要一个,但是当我们的积压过大时,我希望能够自动启动更多来处理负载,以便我们的用户获得良好的体验.现在,手动设置所需节点的数量,但我希望将来使用cloudwatch警报自动完成此操作.
当请求新实例时,它从Chef下载其配置并成功启动,我通过查看日志来了解这一点,显示成功的Chef运行.它加入其他实例并开始使用队列中的消息.但是在启动10分钟后,它会因为心跳超时而导致实例"无法启动"而终止.然后它尝试启动一个新实例并继续循环.
当实例启动时,它将停留在"待处理:等待"状态.与我的Web服务器自动扩展组不同,它永远不会离开此状态,直到它稍后终止.这两个实例大致相同,只是这不会运行Web服务器.
我已经尝试将健康检查宽限期和冷却时间调整为1500秒,但实例总是在10分钟内(有时是11)终止.我还尝试将"HealthCheck"和"AddToLoadBalancer"添加到暂停进程列表中,但这似乎没有效果.
我还尝试使用Set-ASInstanceHealth(或aws autoscaling set-instance-health知道CLI版本的人)手动设置实例的运行状况.这也没有效果.
我确实有一个由autoscaling组启动的实例,所以不知何故,它在某一点上能够启动实例.我认为问题在于心跳问题,但我不明白是什么发送它,我找不到任何关于此的文档.
我的猜测是,当实例完成启动并且其上的软件配置正确时,我需要设置一个标志.与ELB关联的实例已经拥有此实例,因为它们具有正常运行的Web服务器,但不在任何端口上侦听的实例需要额外的内容.这是我和其他自动缩放组之间唯一的区别.
我正在尝试构建一个简单的OpenGL 3.2程序,它由一个单独的片段着色器组成,但我似乎无法实际编译着色器.我很确定我的着色器语法是正确的,但即使不是,我也无法使用glGetShaderInfoLog.
我开发了一个简短的程序,显示了这个:
GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
const char *shaderData =
"#version 120\n"
"void main()\n"
"{\n"
" gl_FragColor = gl_Color;\n"
"}\n";
glShaderSource(shader, 1, &shaderData, NULL);
GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE)
{
GLint infoLogLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
GLchar* strInfoLog = new GLchar[infoLogLength + 1];
glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
fprintf(stderr, "Compilation error in shader %s: %s\n", this->name, strInfoLog);
delete[] strInfoLog;
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下信息:
着色器片段着色器中的编译错误:
问题似乎是每次调用getShaderiv检索GL_INFO_LOG_LENGTH值都返回0,因此我分配一个空字符串.我已经尝试将这个值硬编码为100,但我仍然没有收到任何信息getShaderInfoLog.
我在这里关心的不是修复着色器(如果它是错误的话我可以自己做),但要获取调试信息.我知道这可以做到,因为我已经使用Shader Maker简要地开发着色器,并且我能够获得非常详细的调试消息.例如:
ERROR: 0:11: …
我正在使用以下(大大简化)的MSBuild脚本:
<?xml version="1.0"?>
<Project DefaultTargets="Transform" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="Transform">
<TransformXml Source="../web.config"
Transform="Config\Production\webapp.xml"
Destination="Config\Build\Production\web.config" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
这非常适合转换单个配置文件,而无需通过MSDeploy.
但是,让我说在我的变换中我拼错了一个变量.我会收到一个警告:
C:\ MyApp\DevOps\Config\Production\webapp.xml(15,6):警告:源文档中的任何元素都不匹配'/ configuration/appSettings/add [@ key ='MyUnknownVariable']'[C:\ MyApp \的DevOps\ConfigBundle.msbuild]
虽然我们收到警告是很好的,但我真的需要这个错误,因为这将成为我们自动构建和部署过程的一部分,所以在应用程序停止工作之前,不太可能有人发现它.
我想要一种方法将这些警告视为错误.基于我在互联网上看到的一些东西,我尝试了一个带有两个不同TreatWarningsAsErrors符号的PropertyGroup:
<PropertyGroup>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我已经尝试在命令行上设置它(我怀疑它与上面相同):
C:\MyApp\DevOps>msbuild /p:TreatWarningsAsErrors="true" ConfigBundle.msbuild
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这些都不起作用; 警告继续发送.基于这一点,我猜测它是由个人MSBuild任务来尊重TreatWarningsAsErrors指令,在这种情况下,TransformXml不会.
如果我能找到一种方法来了解上一个任务是否发出警告,例如我可以做以下事情:
<Message Text="##teamcity[message text='Config Transform Failed!' status='ERROR']" Condition="$WarningOccurred == 'true'" />
Run Code Online (Sandbox Code Playgroud)
它并不完美,但肯定会阻止构建成功完成.希望有人会对此有一个有用的建议.
我正在开发一个 AutoCAD 插件,它使用 .NET 4.6 程序集。我发现开发过程非常令人沮丧;API 非常大,除了入门之外的文档也到处都是,而且很难找到。完成任何事情的唯一方法似乎就是在 Visual Studio 中制作函数原型并查看它是否有效。然后需要几分钟的时间来加载 AutoCAD 并附加调试器,这破坏了我的原型制作工作流程。
如果我可以使用 Linqpad 之类的东西来制作我的应用程序原型,这样我就可以找到我正在寻找的数据,那将会非常方便。我并不认同使用 Linqpad 的想法;然而,如果我缺少另一种技术,我很想听听。
我不确定这是否是我可以通过专业版实现的目标,但由于没有试用,我无法找到答案。
看来,当我在我的Xamarin.iOS项目中引用AutoMapper v3.1.0时,构建失败并显示以下错误消息:
Error MT2002: Failed to resolve "System.Linq.Expressions.Expression System.Linq.Expressions.ExpressionVisitor::Visit(System.Linq.Expressions.Expression)" reference from "System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" (MT2002)
Run Code Online (Sandbox Code Playgroud)
当我在添加之前回滚到修订版本时,一切正常.
不幸的是,我已经在我的单元测试中使用AutoMapper做了很多工作,现在删除它会有问题.我想这是一个值得学习的教训:仅仅因为它在测试中起作用并不意味着它在Xamarin.iOS中起作用.
如果有人有任何想法,我将非常感激.
编辑:我现在已经在AutoMapper包中发现了一个MonoTouch目录,但引用其中的AutoMapper.dll和AutoMapper.iOS.dlls并不能解决问题.
编辑#2:此问题仅在为设备构建时发生 - 我猜MSIL到本机转换器由于某种原因不喜欢AutoMapper.我试图找到一种方法来"暗示"我们需要这些符号的编译器,这就是我认为LinkerPleaseInclude.cs文件的目的.
我目前有一个存储在ElasticSearch中的相当简单的文档,我使用集成测试生成:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "unit-test_project600",
"_type" : "recordDefinition505",
"_id" : "400",
"_score" : 1.0, "_source" : {
"field900": "test string",
"field901": "500",
"field902": "2050-01-01T00:00:00",
"field903": [
"Open"
]
}
} ]
}
}
Run Code Online (Sandbox Code Playgroud)
我想特别筛选field903和值"Open",所以我执行以下查询:
{
query: {
filtered: {
filter: {
term: {
field903: "Open",
}
}
} …Run Code Online (Sandbox Code Playgroud) c# ×4
xamarin.ios ×3
xamarin ×2
.net ×1
.net-4.0 ×1
asp.net ×1
autocad ×1
automapper ×1
autoscaling ×1
c++ ×1
datetime ×1
generics ×1
heap ×1
ide ×1
ios ×1
linqpad ×1
macos ×1
msbuild ×1
mvvmcross ×1
nancy ×1
nest ×1
nsopenglview ×1
objectarx ×1
opengl ×1
razor ×1
reference ×1
shader ×1
string ×1