我试图验证我对C#/ .NET/CLR如何处理值类型和引用类型的理解.我读过很多矛盾的解释
这就是我今天所理解的,如果我的假设是错误的,请纠正我.
诸如int等的值类型存在于堆栈上,引用类型存在于托管堆上,但是如果引用类型具有例如double类型的实例变量,则它将与其对象一起存在于堆上
第二部分是我最困惑的.
让我们考虑一个名为Person的简单类.
Person有一个名为Name的属性.
假设我在另一个类中创建了Person实例,我们称之为UselessUtilityClass.
请考虑以下代码:
class UselessUtilityClass
{
void AppendWithUnderScore(Person p)
{
p.Name = p.Name + "_";
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们在某处:
Person p = new Person();
p.Name = "Priest";
UselessUtilityClass u = new UselessUtilityClass();
u.AppendWithUnderScore(p);
Run Code Online (Sandbox Code Playgroud)
Person是一个引用类型,当传递给UselessUtilityClass时 - 这就是我去的地方 - 坚果...... 作为Person引用实例的VARIABLE p由VALUE传递,这意味着当我写p.Name时我会看到"牧师_"
如果我写的话
Person p2 = p;
Run Code Online (Sandbox Code Playgroud)
我做到了
p2.Name ="不是牧师";
写下p的名字就像下面我会得到"不是牧师"
Console.WriteLine(p.Name) // will print "Not a Priest"
Run Code Online (Sandbox Code Playgroud)
这是因为它们是引用类型并指向内存中的相同地址.
我的理解是否正确?
我认为当人们说.NET中的所有对象都通过Reference传递时会出现一些误解,这并不是基于我的想法.我错了,这就是为什么我来到堆叠器.
为什么这会产生"0"?
object a = 0;
object b = a;
a = null;
Console.WriteLine(b.ToString()); // Produces "0"
Console.Read();
Run Code Online (Sandbox Code Playgroud)
不是b指向同一个位置并且设置a = null有效地使b null?
我编写了一个HtmlHelper扩展来根据我们的一些样式格式化一些内容.当未包含在if中时,帮助程序正确呈现内容.
但是,当我试图将它们包装在razor if语句中时,没有任何内容呈现,我怀疑它与Razor语法有关,我没有正确地做.
码:
<div class="notice">
@if (DataModel.UserHasExpired)
{
Html.MyCustomNotificationBox("someparameter") // My helper Should render a div
}
</div>
Run Code Online (Sandbox Code Playgroud)
如果我将我的通知箱放在if之外,它可以正常工作.我还验证了代码正在进入块中,但是当我检查它时,html中没有生成任何标记.
我尝试过像这样的@,以冒号结尾
@Html.MyCustomNotificationBox("somparameter");
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过@Html.Raw(带上面的..),这完全错误了.
有任何想法吗?
有没有人知道是否有一个通用的JavaScript库来启用滚动许多热门网站为频繁更新的内容做的事情?例如:http://foursquare.com/有一个很好的例子,我想要的,我想如果有一个常见的js库,我似乎无法在谷歌中正确查询,我会省去麻烦.
我正在尝试构建组合标记:
第一个标签:<span class="requiredInidicator">* </span>
第二个标签:( <label>SomeText</label>为简洁而剪裁的属性)
我想结合这些来返回一个MVCHtmlString,但下面的代码完全忽略了span.有人能指出我做错了什么
这是我的代码:
// Create the Label
var tagBuilder = new TagBuilder("label");
tagBuilder.Attributes.Add("id", "required" + id);
//I get the id earlier fyi - not pertinent fyi for this question )
// Create the Span
var required = new TagBuilder("span");
required.AddCssClass("requiredInidicator");
required.SetInnerText("* ");
//Now combine the span's content with the label tag
tagBuilder.InnerHtml += required.ToString(TagRenderMode.Normal);
tagBuilder.SetInnerText(labelText);
var tag = MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
return tag;
Run Code Online (Sandbox Code Playgroud)
创建标记时,将完全忽略范围.当我在调试期间检查标签时,它并不关心我附加via所需的内容.InnerHtml+=
有什么明显的东西我做错了吗?
c# ×4
.net ×2
ajax ×1
asp.net-mvc ×1
clr ×1
html-helper ×1
javascript ×1
jquery ×1
razor ×1
value-type ×1