阅读C#Step by Step,作者提到该类只是对象的蓝图,本身也没用.那么,静态类怎么能单独工作呢?
我确实理解静态类无法实例化的概念,并且作为一个具有静态成员的唯一实例存在.但那个废墟,有点像班级的比喻作为蓝图.如何根据这个蓝图的想法解释静态类?
这可以被视为一般的Java问题,但为了更好地理解我使用Lucene作为示例.
您可以在Lucene中使用不同的Tokenizer来标记文本.有主要的抽象Tokenizer类,然后是许多扩展它的不同类.TokenFilter也是如此.
现在,似乎每次要索引文档时,都会创建一个新的Tokenizer.问题是,既然Tokeinzer只是一个实用类,为什么不让它静止?例如,将所有字母转换为小写字母的Tokenizer可以使用静态方法,该方法只对每个输入所做的输入执行.为我们想要索引的每一段文本创建一个新对象有什么意义?
有一点需要提及 - Tokeinzer有一个私有字段,其中包含它接收到的令牌化输入.我只是不明白为什么我们需要以这种方式存储它,因为对象在标记化过程结束后立即被销毁并返回新的标记化文本.我唯一能想到的是多线程访问可能吗?
谢谢!
这两个项目之间的性能影响是什么?我最近在野外见过静态类,我不知道该怎么做.
public enum SomeEnum
{
One = 1,
Two,
Three
}
public static class SomeClass
{
public static readonly int One = 1;
public static readonly int Two = 2;
public static readonly int Three = 3;
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种从函数或方法返回的类型,首先传达它是否成功,然后将消息(作为字符串)附加到它以传递有关其失败原因的更多信息.它可能是应用程序退出代码的一部分; 但是,我不创建一整套退出代码来索引特定的错误消息.我喜欢单个"成功"退出代码的想法,因此可以快速检查呼叫是否失败并相应地工作.
我想把它作为一系列静态方法(如服务调用)的返回类型,为此我可以创建一个包含这两个字段的类(bool和string); 但是,我觉得这些可能已经存在,尽管我还没有找到它.此外,如果有更好的做法来处理从方法获得此类信息的返回,或者完全反对这些静态类的一般规则,我欢迎您的意见.
为了更好的可视化
public static <type> CreateSomething(string somethingName)
{
...
return new <type>("Fail!", "Because...");
}
Run Code Online (Sandbox Code Playgroud) 很多时候我听说要避免使用静态类,因为它们会插入依赖项,这会导致代码在其他项目中无法使用,并且不允许对其进行单元测试.
假设我们有一个典型class DB的访问数据库,如果这样的类static我们可以在我们的代码中的任何地方调用它:
DB::execQuery(...);
Run Code Online (Sandbox Code Playgroud)
但是这会产生依赖关系,所以让我们使DB类不是静态的,在这种情况下我们会在代码中的某个地方:
$db = new DB();
Run Code Online (Sandbox Code Playgroud)
然后我们可以调用我们的代码
$db->execQuery(...);
Run Code Online (Sandbox Code Playgroud)
但是现在当使用$db内部时function我们需要每次都像这样首先声明它
global $db;
有办法解决这个问题吗?
一种方法可能是$db在使用它的类中注入对象,但我必须在使用它的所有类中注入它,这是荒谬的,静态类可以更快地处理并且编写更少的代码.我错过了什么吗?!
我知道如何在c#中制作可插拔的东西.定义一个接口,Activator.CreateInstance(<class>)等等.或者我可以有一个显式创建插件类实例的代码路径.很多种方法.
但是,如果我想要插件的服务是静态的(我知道我可以重构,所以它不是,但这不是问题的重点)
具体例子.我有一个提供磁盘I/O抽象的类(读取文件,列表目录,....).现在我想要这种抽象的不同实现,它可以提供来自真实FS,数据库的文件.
根据Olivier Jacot-Descombes的回复,我会有一个FileSystem类(这是真的)这样的
public static class FileSystem
{
static IFSImplemenation s_imple;
static FileSystem()
{
if(<some system setting>)
// converted to singleton instead of static
s_imple = new OldFileSystem()
else
s_imple = new DbFileSystem();
}
public static byte[] ReadFile(string path)
{
return s_imple.ReadFile(path);
}
...
}
Run Code Online (Sandbox Code Playgroud)
重申 - 我有一大堆代码,我不想改变,所以保持调用签名相同很重要 - 这个解决方案实现了
我正在尝试Version为我的应用程序创建一个类,它将在加载时从清单中读取版本号,然后仅参考例如Version.MAJOR我在其他地方需要它的地方.但是,我遇到了这样的问题.这是我目前的代码:
public class Version {
public static final int APPCODE;
public static final int MAJOR;
public static final int MINOR;
public static final char RELEASE;
public static final int BUILD;
static {
try {
Class clazz = Version.class;
String className = clazz.getSimpleName() + ".class";
String classPath = clazz.getResource(className).toString();
if (classPath.startsWith("jar")) {
String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + "/META-INF/MANIFEST.MF";
Manifest manifest = new Manifest(new URL(manifestPath).openStream());
Attributes attr = manifest.getMainAttributes();
APPCODE = Integer.parseInt(attr.getValue("APPCODE"));
MAJOR = Integer.parseInt(attr.getValue("MAJOR")); …Run Code Online (Sandbox Code Playgroud) 这可能是一个显而易见的问题......下面是我用于与数据库交互的静态类的框架.我的问题是:如果一个静态类在应用程序的持续时间内存在,那么这是否意味着字段_context将具有一个长时间保持打开状态的连接?或者如果我使用using包装我所做的调用声明,我可以确信连接只会按预期打开和关闭吗?
public static class MyStaticClass
{
private static dbEntities _context;
static MyStaticClass()
{
_context = new dbEntities();
}
private static void UpdateContext()
{
_context = new dbEntities();
}
public static bool DoSomething(int id)
{
using (var context = _context)
{
var result = (from x in context.table.where(p=>p.id == id) select x).FirstOrDefault();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想WriteColoredText为ConsoleClass 添加一个自定义方法,如下所示:
Console.WriteColoredText(Parametters)
Run Code Online (Sandbox Code Playgroud)
问题是我只找到了有关为特定数据类型创建方法扩展的信息,但是有关类的方法扩展的信息.
如果这不可能,我有哪些类似的替代品?
我试图在JavaScript中创建一个Utility类,并使用Dojo框架.我在这里找不到关于如何在Dojo框架中正确创建静态类的任何地方.我不想每次都要创建一个新的Utility对象.我宁愿不使用Singleton.
我现在有这样的东西......
//Util.js
define(["dojo/_base/declare",
"dojo/domReady!"], function (declare) {
return declare(null, {
//Pass in string format of element's ID
clearTextBox: function (elemID) {
document.getElementById(elemID).value = "";
}
});
});
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是AMD而不是旧版代码