让我们面对现实吧,jQuery/jQuery-ui是一个重载下载.
Google建议延迟加载JavaScript以加快初始呈现速度.我的页面使用jQuery来设置一些位于页面下方的选项卡(主要是在初始视图之外),我想将jQuery推迟到页面呈现之后.
Google的延迟代码在页面加载后通过挂钩到正文onLoad事件为DOM添加标记:
<script type="text/javascript">
// Add a script element as a child of the body
function downloadJSAtOnload() {
var element = document.createElement("script");
element.src = "deferredfunctions.js";
document.body.appendChild(element);
}
// Check for browser support of event handling capability
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>
Run Code Online (Sandbox Code Playgroud)
我想以这种方式推迟加载jQuery,但是当我尝试它时,我的jQuery代码无法找到jQuery(我不是完全出乎意料):
$(document).ready(function() {
$("#tabs").tabs();
});
Run Code Online (Sandbox Code Playgroud)
所以,似乎我需要找到一种方法来推迟执行jQuery代码,直到加载jQuery.如何检测添加的标签是否已完成加载和解析?
作为推论,似乎异步加载也可能包含答案.
有什么想法吗?
是否可以对需要实现构造函数(带参数)的派生类强制执行编译时合同?
我有一个基类与构造函数需要一个参数:
public class FooBase
{
protected int value;
public FooBase(int value) { this.value = value; }
public virtual void DoSomething() { throw new NotImplementedException(); }
}
Run Code Online (Sandbox Code Playgroud)
我想强制我的基类的派生实现相同的构造函数:
public class Foo : FooBase
{
public Foo(int value) : base(value) { }
public override void DoSomething() { Console.WriteLine("Foo: {0}", value); }
}
Run Code Online (Sandbox Code Playgroud)
如果没有实现构造函数,派生类会导致编译器错误,因为基类中没有默认构造函数:
// ERROR: 'Does not contain a constructor that takes 0 arguments'
// Adding default constructor in FooBase eliminates this compiler error, but
// provides a means to instantiate …
Run Code Online (Sandbox Code Playgroud) 我正在使用字符串比较来测试URL路径StringComparison.OrdinalIgnoreCase
.
MSDN提供了以下字符串比较建议这里,但没有说明为什么:
MSDN示例(在上一页的中间):
public static bool IsFileURI(string path)
{
path.StartsWith("FILE:", StringComparison.OrdinalIgnoreCase);
return true;
}
Run Code Online (Sandbox Code Playgroud)
MSDN建议:
"但是,前面的示例使用String.StartsWith(String,StringComparison)方法来测试是否相等.因为比较的目的是测试相等而不是排序字符串,更好的选择是调用Equals方法,如如下例所示."
public static bool IsFileURI(string path)
{
if (path.Length < 5) return false;
return String.Equals(path.Substring(0, 5), "FILE:",
StringComparison.OrdinalIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
问题:为什么MSDN建议第二个例子更好?
讨论要点:
显然,return true;
在第一个例子中是一个bug,应该是return path.StartsWith(...);
.我们可以安全地忽略这一点,因为VB代码是正确的.
在比较相等性之前创建子字符串似乎只使用另一个内存资源,而不仅仅是调用String.StartsWith().
长度<5测试是一个很好的短路,但它可以与之前的代码一样使用.
第二个例子可以被解释为更清晰的代码,但我关注的是性能.子串的创建似乎是不必要的.
MSDN用于实现Dispose()方法的示例模式描述了将对已处置的受管资源的引用设置为null(_resource = null
),但在if (disposing)
块外部执行此操作:
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!_disposed)
{
if (disposing) {
if (_resource != null)
_resource.Dispose();
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_resource = null;
_disposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
不_resource = null
应该放在这个代码块里面?如果进行了调用,Dispose(false)
那么_resource
将为null并且无法随后处理!??
当然, …
我有一个基类来处理"工作".工厂方法根据作业类型创建派生的"作业处理程序"对象,并确保使用所有作业信息初始化作业处理程序对象.
调用工厂方法为Job和Person分配请求处理程序:
public enum Job { Clean, Cook, CookChicken }; // List of jobs.
static void Main(string[] args)
{
HandlerBase handler;
handler = HandlerBase.CreateJobHandler(Job.Cook, "Bob");
handler.DoJob();
handler = HandlerBase.CreateJobHandler(Job.Clean, "Alice");
handler.DoJob();
handler = HandlerBase.CreateJobHandler(Job.CookChicken, "Sue");
handler.DoJob();
}
Run Code Online (Sandbox Code Playgroud)
结果:
Bob is cooking.
Alice is cleaning.
Sue is cooking.
Sue is cooking chicken.
Run Code Online (Sandbox Code Playgroud)
工作处理程序类:
public class CleanHandler : HandlerBase
{
protected CleanHandler(HandlerBase handler) : base(handler) { }
public override void DoJob()
{
Console.WriteLine("{0} is cleaning.", Person);
}
}
public class CookHandler : …
Run Code Online (Sandbox Code Playgroud) 我希望编写一个将URL转换为小写的HTTP模块.我的第一次尝试忽略了国际字符集,效果很好:
// Convert URL virtual path to lowercase
string lowercase = context.Request.FilePath.ToLowerInvariant();
// If anything changed then issue 301 Permanent Redirect
if (!lowercase.Equals(context.Request.FilePath, StringComparison.Ordinal))
{
context.Response.RedirectPermanent(...lowercase URL...);
}
Run Code Online (Sandbox Code Playgroud)
但是除了en-US之外的其他文化呢?我提到土耳其测试提出测试网址:
http://example.com/I??i
Run Code Online (Sandbox Code Playgroud)
这个小阴险的宝石破坏了URL中的大小写转换很简单的想法!它的小写和大写版本分别是:
http://example.com/??ii
http://example.com/II??
Run Code Online (Sandbox Code Playgroud)
要将大小写转换为使用土耳其语URL,我首先必须将ASP.NET的当前文化设置为土耳其语:
<system.web>
<globalization culture="tr-TR" />
</system.web>
Run Code Online (Sandbox Code Playgroud)
接下来,我不得不更改我的代码以使用当前文化进行大小写转换:
// Convert URL virtual path to lowercase
string lowercase = context.Request.FilePath.ToLower(CultureInfo.CurrentCulture);
// If anything changed then issue 301 Permanent Redirect
if (!lowercase.Equals(context.Request.FilePath, StringComparison.Ordinal))
{
context.Response.RedirectPermanent(...);
}
Run Code Online (Sandbox Code Playgroud)
可是等等!将StringComparison.Ordinal
仍然工作?或者我应该使用StringComparison.CurrentCulture
?我真的不确定!
即使以上工作,使用当前文化进行大小写转换会破坏 NTFS文件系统!假设我有一个名称为的静态文件I??i.html …
我使用非常相似的循环来迭代任何传递对象的所有公共字段和属性.我确定字段/属性是否使用特定的自定义属性进行修饰; 如果是,则对字段或属性的值执行操作.需要两个循环,因为获取字段值的方法与获取属性值的方法不同.
// Iterate all public fields using reflection
foreach (FieldInfo fi in obj.GetType().GetFields())
{
// Determine if decorated with MyAttribute.
var attribs = fi.GetCustomAttributes(typeof(MyAttribute), true);
if (attribs.Length == 1)
{
// Get value of field.
object value = fi.GetValue(obj);
DoAction(value);
}
}
// Iterate all public properties using reflection
foreach (PropertyInfo pi in obj.GetType().GetProperties())
{
// Determine if decorated with MyAttribute.
var attribs = pi.GetCustomAttributes(typeof(MyAttribute), true);
if (attribs.Length == 1)
{
// Get value of property.
object value = …
Run Code Online (Sandbox Code Playgroud) 作者后编辑:选择解决方案
(原始问题仍在此框下方)
摘要:您不应该将类命名为与其命名空间相同的类.因此,产品名称应该用于命名空间还是主类?
选择的解决方案:我决定将产品名称应用于命名空间,并在主类名称中添加后缀(例如,__ Module).
基本原理: Visual Studio默认使用项目名称作为命名空间,程序集名称,以及实际可交付的.exe或.dll - 这些是最明显的项目,所以我认为在我的产品名称之后命名命名空间是有意义的,然后按照Jon Skeet的建议,在他的回答中将主类命名为___Main或__Program或__Module.我想,没有一个正确的答案.
原始问题:
我完全得到它 - 不要把它的名字命名为它的NAMESPACE!
这几乎是一个重复的问题...除了我花了几个小时阅读文章(见下文),无法找到或想到一个似乎正确的解决方案.
说我有一个名为的产品ACME Foobarinator
.它有几个相关类型(例如,设置,枚举)但不足以调用任何类型的命名空间层次结构.
创建单个产品命名空间并将所有内容放入其中是有意义的:
namespace Acme.Web.Foobarinator
{
public class Foobarinator { } // BAD! Same name as namespace!
public class FoobarinatorInfo { }
public enum Mode { Disabled, Enabled }
}
Run Code Online (Sandbox Code Playgroud)
坏!!!命名空间和类名都是一样的!!
但是,我也喜欢主类,Foobarinator
因为它是商标名称,我希望消费者按商标名称使用它:var fb = new Foobarinator();
选项1:消除产品命名空间,将所有类型提升到父命名空间.但是这会污染父命名空间,使其具有特定于产品的类型(并不一定是所有公共类型).随着产品的发展,污染将会增加!
namespace Acme.Web
{
public class Foobarinator { }
public class FoobarinatorInfo { }
public enum …
Run Code Online (Sandbox Code Playgroud) 好的,我需要一些帮助.
这是旧的"不能使用接口来强制构造函数/静态方法"的问题.
什么是合适的设计呢?
我有一组数据实体(实体框架的东西),我为此编写了部分类方法来转换为XML(XElement对象).
我有一个实例方法来"保存"XML:
// Convert entity to XML
public XElement ToXml() {}
Run Code Online (Sandbox Code Playgroud)
...我有一个"读取"XML的构造函数:
// Create entity from XML constructor.
public MyEntity(XElement) {}
Run Code Online (Sandbox Code Playgroud)
或者,我可以使用静态工厂方法来"读取"XML:
public static MyEntity ParseXml(XElement) {}
Run Code Online (Sandbox Code Playgroud)
困境:
我可以创建一个强制执行"保存" ToXml()
方法的界面,但如果它只解决了一半的问题呢?接口无法强制执行任何"加载"方法.
我可以依靠自己的良好意图来创建这些方法,而不需要任何合同.
我可以创建充满了像冗余方法静态类XmlToEntity1()
和XmlToEntity2()
等...(现在我已经描述了良好的"仿制药"的问题).不过,具体的转换代码(这是具体到每一个实体)将创建单独的方法或每个开关/ case并且似乎属于实体类,而不是在其他一些类中,不是吗?
如果有经验的C#编码器可以为这个常见问题展示一个好的设计,我想我会从中学到很多东西.
七月四日快乐!
XmlSerializer
具有两个静态泛型方法的单个类:
public static T Deserialize<T>(XElement xml) {}
public static XElement Serialize<T>(T entity) {}
Run Code Online (Sandbox Code Playgroud)
"不能使用构造函数和静态方法的接口"问题可能是以下症状:
我应该链接到完整的jQuery UI - 或者 -提供精简的自定义副本?
来自像谷歌这样的CDN的完整jQuery-UI与提供定制的最小版本之间存在非常大的差异.此外,可以将jQuery,jQuery UI,插件和本地代码组合到一个缩小的JavaScript下载中.
另一方面,除非他们之前访问过该站点,否则用户具有高速缓存的自定义副本的机会为零.
是否有任何jQuery CDN"渗透"统计数据或研究可以提供哪些更好的洞察?
调用非泛型方法并使用不同泛型类型传递泛型参数的解决方案?
我想象中的梦想:
void FooBulous(Foo<object>[] fooArray) { } // Accept any 'Foo<BaseType>'
var fooArray = new Foo<object>[] // Array of 'Foo<BaseType>'
{
new Foo<Cat>(),
new Foo<Dog>(),
};
FooBulous(fooArray); // Pass the 'Foo<BaseType>[]' array
Run Code Online (Sandbox Code Playgroud)
我的现实:
void BarBaric(object[] barArray) { } // Can't constrain to 'Foo<>'
var barArray = new object[] // Same problem
{
new Bar<Cat>(),
new Bar<Dog>(),
};
BarBaric(barArray); // Barbaric! I thought the 'void *ptr' days were over!
Run Code Online (Sandbox Code Playgroud)
综上所述:
void Fee(object[] params) { /* WORKS! But not constrained to 'Foo<Base>' …
Run Code Online (Sandbox Code Playgroud)