小编Kev*_*ice的帖子

可以推迟加载jQuery吗?

让我们面对现实吧,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.如何检测添加的标签是否已完成加载和解析?

作为推论,似乎异步加载也可能包含答案.

有什么想法吗?

javascript jquery pagespeed

66
推荐指数
4
解决办法
5万
查看次数

强制派生类用参数实现基类构造函数

是否可以对需要实现构造函数(带参数)的派生类强制执行编译时合同?

我有一个基类与构造函数需要一个参数:

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)

.net c#

16
推荐指数
2
解决办法
3万
查看次数

String.Equals(string1.Substring(0,x),string2)是否优于string1.StartsWith(string2)?

我正在使用字符串比较来测试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建议第二个例子更好?

讨论要点:

  1. 显然,return true;在第一个例子中是一个bug,应该是return path.StartsWith(...);.我们可以安全地忽略这一点,因为VB代码是正确的.

  2. 在比较相等性之前创建子字符串似乎只使用另一个内存资源,而不仅仅是调用String.StartsWith().

  3. 长度<5测试是一个很好的短路,但它可以与之前的代码一样使用.

  4. 第二个例子可以被解释为更清晰的代码,但我关注的是性能.子串的创建似乎是不必要的.

.net c#

13
推荐指数
1
解决办法
2043
查看次数

MSDN Dispose()示例错误?(何时将托管引用设置为null)

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并且无法随后处理!??

当然, …

c#

12
推荐指数
1
解决办法
2279
查看次数

仅允许Factory方法实例化对象(防止实例化基类和未初始化的对象)

我有一个基类来处理"工作".工厂方法根据作业类型创建派生的"作业处理程序"对象,并确保使用所有作业信息初始化作业处理程序对象.

调用工厂方法为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)

.net c#

9
推荐指数
1
解决办法
4632
查看次数

在不破坏文件系统或文化的情况下,将URL规范化为小写?

将URL规范化为小写

我希望编写一个将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 …

c# asp.net winapi

8
推荐指数
2
解决办法
1757
查看次数

c#迭代父类型数组以在派生类型上调用非多态方法

我使用非常相似的循环来迭代任何传递对象的所有公共字段和属性.我确定字段/属性是否使用特定的自定义属性进行修饰; 如果是,则对字段或属性的值执行操作.需要两个循环,因为获取字段值的方法与获取属性值的方法不同.

// 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)

c#

8
推荐指数
1
解决办法
738
查看次数

产品商标名称为具有相同名称的类/命名空间

作者后编辑:选择解决方案

(原始问题仍在此框下方)

摘要:您不应该将类命名为与其命名空间相同的类.因此,产品名称应该用于命名空间还是主类?

选择的解决方案:我决定将产品名称应用于命名空间,并在主类名称中添加后缀(例如,__ 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)

.net c#

5
推荐指数
1
解决办法
226
查看次数

C#"无法在接口中指定构造函数/静态方法"问题所需的正确解决方案

好的,我需要一些帮助.

这是旧的"不能使用接口来强制构造函数/静态方法"的问题.

什么是合适的设计呢?

我有一组数据实体(实体框架的东西),我为此编写了部分类方法来转换为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)

困境:

  1. 我可以创建一个强制执行"保存" ToXml()方法的界面,但如果它只解决了一半的问题呢?接口无法强制执行任何"加载"方法.

  2. 我可以依靠自己的良好意图来创建这些方法,而不需要任何合同.

  3. 我可以创建充满了像冗余方法静态类XmlToEntity1()XmlToEntity2()等...(现在我已经描述了良好的"仿制药"的问题).不过,具体的转换代码(这是具体到每一个实体)将创建单独的方法或每个开关/ case并且似乎属于实体类,而不是在其他一些类中,不是吗?

如果有经验的C#编码器可以为这个常见问题展示一个好的设计,我想我会从中学到很多东西.

七月四日快乐!

可能的解决方案1

XmlSerializer具有两个静态泛型方法的单个类:

public static T Deserialize<T>(XElement xml) {}
public static XElement Serialize<T>(T entity) {}
Run Code Online (Sandbox Code Playgroud)
  • Pro:只有一个类(不需要接口)
  • Pro:将序列化责任与实体类分开.
  • Con:对于支持的每种实体类型,仍然需要单独的方法或开关/案例块.
  • 骗局:?不可扩展 - 每次实体更改或添加/删除时都必须修改此类.

可能的经验教训?

"不能使用构造函数和静态方法的接口"问题可能是以下症状:

  1. 违反SRP(单一责任委托人).
  2. 违反SoC(关注分离)主体.

c#

3
推荐指数
1
解决办法
156
查看次数

主机定制(较小)jQuery UI与从CDN下载到全尺寸(大)下载的链接?

我应该链接到完整的jQuery UI - 或者 -提供精简的自定义副本?

来自像谷歌这样的CDN的完整jQuery-UI与提供定制的最小版本之间存在非常大的差异.此外,可以将jQuery,jQuery UI,插件和本地代码组合到一个缩小的JavaScript下载中.

另一方面,除非他们之前访问过该站点,否则用户具有高速缓存的自定义副本的机会为零.

是否有任何jQuery CDN"渗透"统计数据或研究可以提供哪些更好的洞察?

jquery jquery-ui cdn

1
推荐指数
1
解决办法
482
查看次数

调用非泛型方法(Generic <Base> [] args)并传递Generic <Derived>数组?

调用非泛型方法并使用不同泛型类型传递泛型参数的解决方案?

我想象中的梦想:

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)

c# c#-4.0

0
推荐指数
1
解决办法
196
查看次数

标签 统计

c# ×9

.net ×4

jquery ×2

asp.net ×1

c#-4.0 ×1

cdn ×1

javascript ×1

jquery-ui ×1

pagespeed ×1

winapi ×1