我知道如何在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)
重申 - 我有一大堆代码,我不想改变,所以保持调用签名相同很重要 - 这个解决方案实现了
在某个地方,我看到一篇关于创建boost shared_ptr的优化方法的帖子,以便它同时分配ptr管道和指针.我做了SO搜索,但是在shared_ptr 上有很多帖子,我找不到它.有人聪明,请重新发布
编辑:谢谢你的回答.额外的信用问题.什么是正确的(首选的?)习惯用于返回null shared_ptr?即
FooPtr Func()
{
if(some_bad_thing)
return xxx; // null
}
Run Code Online (Sandbox Code Playgroud)
对我来说
return FooPtr((Foo*)0);
Run Code Online (Sandbox Code Playgroud)
看起来有点笨拙
我有类似的东西
V Func<V>()
{
// do stuff
V res = default(V);
// more stuff
return res;
}
Run Code Online (Sandbox Code Playgroud)
问题是我希望res为0或V的新实例
我试过创建2个方法
Func<V> where T: new()
Func<V> where T: struct
Run Code Online (Sandbox Code Playgroud)
但令人惊讶的是,这是不允许的
我的解决方法是有2个功能
FuncNew<V> where T: new()
...
res = new V();
....
Run Code Online (Sandbox Code Playgroud)
和
FuncDefault<V> where T: struct
...
res = default(V)
...
Run Code Online (Sandbox Code Playgroud)
编辑:总结答案
new(T)将刷新ref或value类型; 我没有意识到这一点
我觉得待定的'关闭问题,太模糊,意见,......'但是这里有.
如何组织我的代码库?
我有一个非常简单的应用程序(unix守护程序),它与其他进程通信,读/写数据库,与Web服务器通信,具有内部状态.在c ++中,我会编写一堆类(可能在主子组件的子目录中).让我们说这是projd
然后在更高级别,我有与项目相关的实用cli函数.projcli1,projcli2 ....我假设与一个项目相关的所有代码都在一个GOPATH下
如果我正在研究几个不相关的项目.我是否仍然使用一个GOPATH,或者我是否每个项目都有一个GOPATH.
我试图找到示例代码库,但唯一的大型集合是包存储库,这是一堆库 - 这实际上并不是一回事.
如果这些问题太过模糊,那么这个问题.是否正确同一目录中的所有go文件必须是同一个包?
另一个简单具体问题.我找到了一个很好的对象池实现.它的包裹说"游泳池" - 很好.我在哪里放置它的单个文件.在一个名为'pool'的子目录中,我想有一个名为utils(或类似的东西)的目录似乎我不能这样做.我的意思是我不能拥有utils/pool和util/db(比如说)没有一个文件目录的树
我有一台1080P显示器.干
int j Screen.PrimaryScreen.Bounds.Width;
int k = Screen.PrimaryScreen.Bounds.Height;
_Bitmap.GetPixel(j, k).GetBrightness();
Run Code Online (Sandbox Code Playgroud)
(_Bitmap大小等于我的屏幕边界),它抛出一个异常,说"参数必须为正且<height".
2桌
用户cols =姓名,电子邮件
joe|joe@gmail.com
sara|sara@hotmail.com
alan|alan@gmail.com
Run Code Online (Sandbox Code Playgroud)
表2是extras cols = name,col,value
joe|favoritecolor|blue
joe|boss|sam
sara|favoritecolor|green
Run Code Online (Sandbox Code Playgroud)
(实际上扩展了第一个表的模式,但没有让sql引擎注意到它)
让人们喜欢的颜色
Select name
, value As favoritecolor
From user
, extras
Where extras.name = user.name
And extras.col = 'favoritecolor'
Run Code Online (Sandbox Code Playgroud)
但是我如何获得最喜欢的颜色和老板?
请注意此查询所需的输出
select name,email,favoritecolor,boss from user
Run Code Online (Sandbox Code Playgroud)
是
joe|joe@gmail|blue|sam
sara|sara@hotmail.com|green|<null>
alan|alan@gmail.com|<null>|<null>
Run Code Online (Sandbox Code Playgroud) 我正在寻找不会收到HTTP错误(例如404)的c#HTTP客户端。这不仅仅是样式问题;它对于非2xx回复具有主体是完全有效的,但是如果在执行GetResponse()时HTTP堆栈抛出异常,我将无法理解它
我有这个结构:
typedef struct person_st{
char *first_name, *last_name;
int id;
Date birthday;
}*pPerson, Person;
Run Code Online (Sandbox Code Playgroud)
让我说我重新分配sizeof(Person)*(++n)几次.在每个结构中,我也为first_name和分配空间last_name.
假设在某些时候使用时会出现分配失败realloc,处理所有first_name和last_name分配的最安全/最智能的方法是什么?它还有一种方法可以在Person结构重新排除故障后释放它们吗?
谢谢.
我有一个对象,我知道它在 an 内部,Arc因为所有实例总是Arced。我希望能够Arc在函数调用中传递我自己的克隆。我正在调用的东西稍后会在其他线程上给我回电。
在 C++ 中,有一个标准的 mixin 叫做enable_shared_from_this. 它使我能够做到这一点
class Bus : public std::enable_shared_from_this<Bus>
{
....
void SetupDevice(Device device,...)
{
device->Attach(shared_from_this());
}
}
Run Code Online (Sandbox Code Playgroud)
如果此对象不受shared_ptr管理(最接近的 C++ 必须Arc),那么这将在运行时失败。
我找不到等价物。
编辑:
这是一个为什么需要它的例子。我有一个定时器队列库。它允许客户端请求在将来的某个时间点运行任意闭包。代码在专用线程上运行。要使用它,您必须传递要稍后执行的函数的闭包。
use std::time::{Duration, Instant};
use timerqueue::*;
use parking_lot::Mutex;
use std::sync::{Arc,Weak};
use std::ops::{DerefMut};
// inline me keeper cos not on github
pub struct MeKeeper<T> {
them: Mutex<Weak<T>>,
}
impl<T> MeKeeper<T> {
pub fn new() -> Self {
Self {
them: Mutex::new(Weak::new()), …Run Code Online (Sandbox Code Playgroud)