我注意到Visual Studio特有的一些东西.首先,尝试在函数中的某处键入此(C#):
class Foo
{
public void Bar()
{
string s;
int i = s.Length;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,马上将迎来s的s.Length是一个错误,说" Use of unassigned local variable 's'".另一方面,请尝试以下代码:
class Foo
{
private string s;
public void Bar()
{
int i = s.Length;
}
}
Run Code Online (Sandbox Code Playgroud)
它将编译,并s在private string s警告中强调中,并说" Field 'Foo.s' is never assigned to, and will always have its default value null".
现在,如果VS是那么聪明并且知道s将永远为null,为什么在第二个例子中得到它的长度不是错误?我最初的猜测是,"如果编译器根本无法完成其工作,它只会产生编译错误.由于代码在技术上运行只要你从不调用Bar(),它只是一个警告." 除非第一个例子使解释无效.只要你从不调用Bar(),你仍然可以毫无错误地运行代码.什么给出了什么?只是疏忽,还是我错过了什么?
c# compiler-construction nullreferenceexception visual-studio
作为开发人员,我们经常会遇到异常:NullReferenceException使用众所周知的错误消息:
你调用的对象是空的
.NET框架不可能返回更有意义的东西吗?
像这样的东西:
名为Y的X类型的对象未设置为对象的实例
如果我在调用期间尝试将null参数传递给委托,则会出现null异常.这是代码的样子:
public void RequestPhoto()
{
WCF.Service.BeginGetUserPhoto(Contact.UserID,
new AsyncCallback(RequestPhotoCB), null);
}
public void RequestPhotoCB(IAsyncResult result)
{
var photo = WCF.Service.EndGetUserPhoto(result);
UpdatePhoto(photo);
}
public delegate void UpdatePhotoDelegate(Binary photo);
public void UpdatePhoto(Binary photo)
{
if (InvokeRequired)
{
var d = new UpdatePhotoDelegate(UpdatePhoto);
Invoke(d, new object[] { photo });
}
else
{
var ms = new MemoryStream(photo.ToArray());
var bmp = new Bitmap(ms);
pbPhoto.BackgroundImage = bmp;
}
}
问题在于:
Invoke(d, new object[] { photo });
如果变量"photo"为null.在调用期间传递null参数的正确方法是什么?谢谢!
更新 问题是语法问题.@awrigley显示了在Razor中编写它的正确方法.
以下作品:
@if(Model.Thing.Prop != null)
{
Html.RenderPartial("SomePartialView", Model.Thing.Prop);
}
Run Code Online (Sandbox Code Playgroud)
您需要显示作为HTML表格Foo的给定顶部1的详细信息Bar.如果为空,如何隐藏空表或显示"未找到"消息Foo?
例如.我正在接受NullReferenceException以下一行,因为Model.Thing.Prop是null;
@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
Run Code Online (Sandbox Code Playgroud)
故意为null,我的Repository返回null而不是null Foo.但这有点撇开,即给定一个null Model.Thing.Prop,我不想打电话给Html.RenderPartial.
更新
我尝试了以下没有运气:
@if(Model.Thing.Prop != null)
{
@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
}
Run Code Online (Sandbox Code Playgroud)
这导致Visual Studio告诉我它预期;第1行第1列也是第1行第1列;的无效表达式(我猜这是由于MVC3的预发布状态),如果我在我得到的浏览器中点击页面
CS1501:方法'Write'没有重载需要0个参数
@Html.RenderPartial突出显示该行.
我也试过了
@if(Model.Thing.Prop != null)
{
<text>
@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
</text>
}
Run Code Online (Sandbox Code Playgroud)
但这会导致NullReferenceException我的部分视图中出现一个似乎不对的内容.Model.Thing绝对是有效的Bar,Model.Thing.Prop绝对是一个null Foo.
asp.net-mvc renderpartial nullreferenceexception razor asp.net-mvc-3
考虑以下代码:
A a = null;
a.f(); //Will it throw NullReferenceException?
Run Code Online (Sandbox Code Playgroud)
请问以上投掷NullReferenceException?
答案是:这取决于什么f().
这种差异导致了一个问题:C#编译器如何实现和查看每种类型的方法?另外,为什么成员方法必须抛出异常,即使它不访问任何成员数据?似乎C#编译器事先假设成员方法将访问成员数据,因此如果对象为null则抛出异常,因为无法访问使用null对象成员数据.但是,在扩展方法的情况下,它推迟此决定,直到它实际尝试使用空引用访问成员数据,然后才抛出异常.
我的理解到底有多远?如果是这样,为什么会出现这种差异呢?
是的,我知道如果f()是扩展方法,那么a.f()等同于写入AExt.f(a),因此后者不应该抛出异常,直到a用于访问成员.但我的重点主要放在编译器实现上(它可以以相同的方式实现成员方法).
我们确实遇到过这个特殊问题,也是我们编码/开发生活日或其他日子中最常见的例外情况之一.我的问题是不是关于为什么(我知道它提出,当我们试图访问它实际上指向空引用变量的性质),但它是关于如何由CLR所产生的空引用异常.
有时我被迫认为用于标识对null的引用的机制(可能null是内存中的保留空间)然后通过CLR引发Exception.CLR如何识别并引发此特定异常.操作系统在其中扮演任何角色吗?
我想分享一个关于它的最有趣的主张:
null实际上是CLR已知的所有时间保留的内存空间,并且禁止所有类型的访问.因此,当找到该空间的引用时,它默认通过OS生成访问被拒绝的异常类型,这被CLR解释为NULL引用异常.
我没有找到支持上述陈述的任何文章或帖子,因此很难相信.可能由于我缺少挖掘细节或其他原因,我希望Stackoverflow是最合适的平台之一,我会得到最好的响应.
我正在尝试在SpecFlow 1.9中添加我的CodedUI测试生成器插件.我正在尝试使用新的插件注册,因为旧的注册类型会在我们的解决方案中引起各种问题,因为我们不希望将自定义Generator Provider放在Specflow安装目录中(在每个开发人员计算机上都不同) .
我开始将新的Specflow.CustomPlugin NuGet包添加到.NET 4.0类库中.
基于CodedUI Generator的示例,我将它拼凑在一起:
using TechTalk.SpecFlow.Infrastructure;
[assembly: GeneratorPlugin(typeof(CodedUIGeneratorProvider.Generator.SpecFlowPlugin.CodedUIGeneratorPlugin))]
namespace CodedUIGeneratorProvider.Generator.SpecFlowPlugin
{
using System.CodeDom;
using BoDi;
using TechTalk.SpecFlow.Generator;
using TechTalk.SpecFlow.Generator.Configuration;
using TechTalk.SpecFlow.Generator.Plugins;
using TechTalk.SpecFlow.Generator.UnitTestProvider;
using TechTalk.SpecFlow.UnitTestProvider;
using TechTalk.SpecFlow.Utils;
/// <summary>
/// The CodedUI generator plugin.
/// </summary>
public class CodedUIGeneratorPlugin : IGeneratorPlugin
{
/// <summary>
/// The register dependencies.
/// </summary>
/// <param name="container">
/// The container.
/// </param>
public void RegisterDependencies(ObjectContainer container)
{
}
/// <summary>
/// The register customizations.
/// </summary>
/// …Run Code Online (Sandbox Code Playgroud) 我正在使用MVC和Razor视图.在这个特定的视图中,我传递的是该类的单个实例Bed.Bed有房产string Infection.现在在这个例子中,我HasInfection在视图中定义了一个布尔值,我在其他地方用它来改变显示的内容.这最初被宣布为
var HasInfection = (Model.Infection.Trim() != "";
Run Code Online (Sandbox Code Playgroud)
并按预期工作.但是,现在有一个用例Bed可能为null.这是第一个代码块:
@{
ViewBag.Title = "Edit";
var HasInfection = false;
if (Model != null)
{
HasInfection = Model.Infection.Trim() != "";
} // I get a NRE on this line whenever Model is null
}
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过复杂的嵌套if-else解决方案,而且我仍然在结束时得到一个NRE if.
if (Model.Infection == null)
{
HasInfection = false;
}
else
{
if (Model.Infection != "")
{
HasInfection = true;
}
else
{
HasInfection = false;
} …Run Code Online (Sandbox Code Playgroud) 当我登陆我的一个MVC页面时,我收到此错误,在dll名称中有一个随机字符串.
App_Web_cjmhrrqn.dll中发生System.NullReferenceException类型的第一次机会异常.附加信息:未将对象引用设置为对象的实例.
在另一个页面上,当我点击页面上的第一行代码时,我会得到相似之处,无论它是什么:
App_Web_register.cshtml.5f83eb8c.gq-8jyy8.dll中发生System.NullReferenceException类型的第一次机会异常
但是,这不是代码的问题.我删除了它失败的行,并在下一行代码中继续失败.我甚至可以放几行新代码,它会在最后一行中断.
它发生在整个应用程序的几个地方.
它也发生在我的Azure部署上.
该错误无助于找到问题.
我的怀疑是某种DLL问题,但我已经清除了我的bin,obj和ASP.NET临时文件夹.
有谁见过这个问题,还是有什么想法?我需要清除其他任何临时文件夹吗?或者任何其他方法来缓解这个问题?为什么它仍然在我的现场网站上呢?
c# asp.net-mvc nullreferenceexception asp.net-mvc-partialview
今天早上我突然去上班,做了一个最新版本,然后我开始使用Sitecore 6.5,我的工作状况还不错
[NullReferenceException: Object reference not set to an instance of an object.]
Sitecore.Shell.Applications.ContentEditor.Editors.Folder.FolderPage.Render() +358
System.Web.UI.Control.LoadRecursive() +70
System.Web.UI.Control.LoadRecursive() +189
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3177
Run Code Online (Sandbox Code Playgroud)
另外,有时在打开文件夹时出现此错误:
> [InvalidOperationException: The Sitecore.Client.Device is null.]
> Sitecore.Client.get_Device() +86 Sitecore.UIUtil.GetBrowserClassString() +326
> Sitecore.sitecore.login.LoginPage.AddBrowserAttributes() +135
> Sitecore.sitecore.login.LoginPage.OnPreRender(EventArgs e) +435
> System.Web.UI.Control.PreRenderRecursiveInternal() +113
> System.Web.UI.Page.ProcessRequestMain(Boolean
> includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
> +4297
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决它?