我想知道这一点,因为我需要继承StringBuilder
来实现一个TextChanged
事件.我总是可以创建一个包含private StringBuilder
隐式/显式转换的包装器,但这似乎不是一个合适的解决方案.
幸运的是,我可以从写入StringBuilder的对象继承,所以这对我来说不是一个问题,但我仍然很好奇为什么这个类是密封的.
我的公司目前正在尝试使用 Google Dialogflow 构建一个多租户聊天机器人。我们正在探索我们可以使用的工具,但关于该主题的文档仍然有点稀缺。在这种情况下,我们对多租户的理解和定义将允许我们根据最终用户工作的公司拥有略有不同的对话流程。例如:
Foo 公司的用户 A 想要订购冰淇淋。Foo 公司提供了一系列口味(巧克力、香草、薄荷)并且只提供蛋卷冰淇淋,但允许用户在他们的冰淇淋中添加装饰物(巧克力片、糖屑)。
Bar 公司的用户 B 想要订购冰淇淋。Company Bar 提供一系列口味(草莓、开心果、柠檬)并供应冰淇淋蛋筒和杯子,但不提供配菜。
两个用户应该有完全相同的对话,除了口味和冰淇淋容器的可用列表取决于租户。此外,还应该可以选择扩展此对话流程的一部分,例如 A 公司提供添加装饰的功能。两个对话应该以相同的意图开始和结束(我想要一个冰淇淋/我准备付钱)。
我们的次要目标是最小化 Dialogflow 端的冗余:理想情况下,只有一个代理,理想情况下,不需要重复的意图不应该被复制。
我们的架构不是客户驱动的;客户端总是被我们的后端服务器 (C#) 拦截,它负责处理与 Dialogflow 的互操作。我们认为这为我们提供了更大的灵活性并更好地与我们现有的堆栈集成。
我们已经确定了这些有前途的功能:
但我们还没有确定明确的路径。我们也在考虑可用的替代方案,例如微软的 BotBuilder、亚马逊的 AWS Chatbot 和开源 ChatterBot。
简而言之,在这方面有最佳实践吗?如果没有,将非常欢迎有关此事的任何想法和想法。
我会尝试更好地解释我的意思,并且我也会尝试将问题从语言中解脱出来,但是如果有一种方法可以在C#中做我想做的事而不必引用任何东西它会很好.无论如何.
我正在处理键盘输入,并将其转换为字符串.一切都很好.我得到了Shift和CapsLock键的状态并且EXOR它,所以我可以找出结果字符串的大小写.
bool shift = KeyDown(SHIFT_KEY)
bool capslock = KeyToggled(CAPSLOCK)
bool stringCasing = shift ^ capslock //if both are true/false, the string will be lowercase. Otherwise uppercase.
foreach Key k in [list of keys passed as parameter]
char c = (char)k
if stringCasing
c = Char.ToUpper(c)
else
c = Char.ToLower(c)
end foreach
Run Code Online (Sandbox Code Playgroud)
现在没有问题.如果用户在按住shift键或切换大写字母时键入"a",则它变为"A".
但是,如果用户决定键入"!",即"1"加上shift,我只得到1,因为"1"大写仍为"1".
在问这个问题之前我在网上看了一下,但我得到的只是"自己映射键".这真的是唯一的答案吗?而且,如果我映射键然后使用不同键盘布局的用户试图使用我的应用程序会发生什么?提前致谢.
我的问题,缩小到一个简单的解释,如下:我有一个类需要使用一个数字(不改变它),这可能会改变.这个数字不一定来自另一个类,它可以是任何类.但是我想只给它一次"给"它一次,而不是经常不得不调用更新方法或不得不创建一个包装器(因为我再说过,这应该适用于任何类型的数字并且必须包装一切都是不切实际的).
这是一些代码,希望它有所帮助:
public class SimpleExample
{
int value;
public SimpleExample(int variableOfWhichINeedAReference)
{
//Of course this won't work, but I'll keep it simple.
value = variableOfWhichINeedAReference;
}
public void DisplayValue()
{
print(value);
}
}
public class RandomClass
{
int myValue = 10;
SimpleExample s = new SimpleExample(myValue);
public void WorkWithValue()
{
myValue++;
}
public void Display()
{
print(foo);
print(bar);
s.DisplayValue();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,问题似乎非常明显:如果我实例化一个SimpleExample并给它一个变量作为参数,它将获得它的值而不是它的引用.有一种简单的方法可以避免我创建一个包装器吗?谢谢.
可能重复:是否
会执行逻辑表达式中的所有方法?
让我解释一下:假设我们有两个代码:
foreach(Object o in Objs)
if(o is Class1 || o is Class2)
DoSomething();
Run Code Online (Sandbox Code Playgroud)
__
foreach(Object o in Objs)
if(o is Class1)
DoSomething();
else if(o is Class2)
DoSomething();
Run Code Online (Sandbox Code Playgroud)
当然,现今的或在这种情况下更好,但我的问题是不同的,只是出于好奇:在第一种情况下o是类型Class 1的,该编译器停止并运行代码或它检查接下来会发生什么呢?它会在第二种情况下这样做.
c# ×4
.net ×1
ascii ×1
botframework ×1
char ×1
chatbot ×1
chatterbot ×1
inheritance ×1
modifier-key ×1
multi-tenant ×1
reference ×1
sealed ×1
variables ×1