我有以下代码:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBox Text="{Binding Path=Name,
Mode=OneWayToSource,
UpdateSourceTrigger=Explicit,
FallbackValue=default text}"
KeyUp="TextBox_KeyUp"
x:Name="textBox1"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
BindingExpression exp = this.textBox1.GetBindingExpression(TextBox.TextProperty);
exp.UpdateSource();
}
}
}
public class ViewModel
{
public string Name
{
set
{
Debug.WriteLine("setting name: " + value);
}
}
}
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs …Run Code Online (Sandbox Code Playgroud) 来自MSDN:
通过消除不必要的强制转换,隐式转换可以提高源代码的可读性.但是,因为隐式转换可以在程序员指定它们的情况下发生,所以必须注意防止令人不快的意外.通常,隐式转换运算符不应该抛出异常并且永远不会丢失信息,以便在没有程序员意识的情况下可以安全地使用它们.如果转换运算符不符合这些条件,则应将其标记为显式.
虽然我并不反对任何特定的观点,并且我同意这一切都非常好,但有没有一个理由可以保证打破关于隐式转换而不抛出异常的部分?
我面前的具体案例是:
FooCollection).现在,我正在讨论是否包含来自FooCollection=> 的隐式转换Foo来隐藏这个小实现细节,但这种转换只有在集合中有一个项目时才有效.
Exception在这种情况下可以抛出吗?或者我应该使用显式演员代替吗?关于我如何处理这个的任何其他想法(不,由于实现细节,我不能只使用两个函数)?
编辑:我觉得值得注意的是,FooCollection没有实现任何接口或实际扩展Collection名称可能意味着,因此基于LINQ的答案是无用的.此外,虽然集合确实实现了数字索引,但它并不是处理集合的最直观方式,因为它主要依赖于命名索引.
我最近了解了explicit说明者.
假设我们有:
f( W, W, W );
Run Code Online (Sandbox Code Playgroud)
如果我们这样做
f( 42, 3.14, "seven" );
Run Code Online (Sandbox Code Playgroud)
编译器将尝试以下隐式转换:
f( W(42), W(3.14), W("seven") );
Run Code Online (Sandbox Code Playgroud)
如果我们为W定义了匹配的构造函数,即:
W(int);
W(double);
W(std::string);
Run Code Online (Sandbox Code Playgroud)
......它会成功的.
但是,如果我们明确第一个:
explicit W(int);
Run Code Online (Sandbox Code Playgroud)
...这会禁用隐式转换.
你现在必须写:
f( W(42), 3.14, "seven" );
Run Code Online (Sandbox Code Playgroud)
即它迫使您明确说明转换
现在回答这个问题:
有可能写:
explicit W(int,int); // 2 arguments!
Run Code Online (Sandbox Code Playgroud)
这编译!
但是我看不到任何可能需要这种语法的相应场景.
有人能提供一个最小的例子吗?
我认为Implicit链接在应用程序启动后立即加载DLL,因为它也称为"加载时动态链接".但是我在下面的链接中找到了一些奇怪的解释(https://msdn.microsoft.com/en-us/library/253b8k2c(VS.80).aspx).
隐式链接
与程序代码的其余部分一样,DLL代码在进程启动时映射到进程的地址空间,并且只在需要时才加载到内存中.因此,.def文件用于控制以前版本的Windows中的加载的PRELOAD和LOADONCALL代码属性不再具有意义.
显式链接
隐式链接到许多DLL的应用程序启动很慢,因为Windows会在应用程序加载时加载所有DLL.为了提高启动性能,应用程序可以隐式链接到加载后立即需要的那些DLL,并等待在需要时显式链接到其他DLL.
从这里隐式链接的另一种解释(https://msdn.microsoft.com/en-us/library/151kt790.aspx).
隐式链接
Visual C++链接器现在支持DLL的延迟加载.这使您无需使用Windows SDK函数LoadLibrary和GetProcAddress来实现DLL延迟加载.
在Visual C++ 6.0之前,在运行时加载DLL的唯一方法是使用LoadLibrary和GetProcAddress; 当加载使用它的可执行文件或DLL时,操作系统将加载DLL.
从Visual C++ 6.0开始,当与DLL静态链接时,链接器提供延迟加载DLL的选项,直到程序调用该DLL中的函数.
应用程序可以使用带有辅助函数的/ DELAYLOAD(延迟加载导入)链接器选项延迟加载DLL(Visual C++提供的默认实现).辅助函数将通过为您调用LoadLibrary和GetProcAddress在运行时加载DLL .
我真的很困惑,不知道如何理解这些.
1.隐式链接是在启动时还是仅在调用DLL中的函数时加载DLL?
这意味着两者最终都是类似的,因为LoadLibrary()是在引擎盖下调用的?
我玩了显式构造函数及其行为,所以我创建了这个类:
#include <iostream>
class X
{
public:
explicit X(void)
{
std::cout << "Default constructor\n";
}
explicit X(X const& x)
{
std::cout << "Copy constructor\n";
}
explicit X(X&& x)
{
std::cout << "Move constructor\n";
}
};
Run Code Online (Sandbox Code Playgroud)
这基本上只是测试显式构造函数的存根.然后我想尝试几种情况.所以我尝试了这个:
X foo(void)
{
X a{};
return a; // ERROR: no matching constructor found!
}
int main()
{
X w{}; // Default Constructor
X x{w}; // Copy Constructor
X y{std::move(x)}; // Move Constructor
X z{foo()};
}
Run Code Online (Sandbox Code Playgroud)
你可以看到我不能回到a里面foo().我知道它尝试Foo使用复制构造函数初始化返回类型,但由于某种原因它无法使用它.
为什么它不能使用我提供的拷贝构造函数?我知道explicit …
我正在创建自己的类,String仅用于学习目的.
我坚持到应该做出决定的地方.让我解释一下这件事.
我有两个班级选择.我将在下面仅发布相关的代码片段,因为我不想分散您对我手头的问题的注意力.如果为了帮助我,你需要更多信息,我很乐意提供.
选项1
class String {
size_t _length;
char* _stringHead;
public:
String(const std::string&);
String(const char*);
String(const char);
};
String operator+(String, const String);
const bool operator==(const String, const String);
const bool operator!=(const String, const String);
const bool operator<(const String, const String);
const bool operator<=(const String, const String);
const bool operator>(const String, const String);
const bool operator>=(const String, const String);
Run Code Online (Sandbox Code Playgroud)
选项2
class String {
size_t _length;
char* _stringHead;
public:
//irrelevant part of code in Option 2
String(const std::string&);
String(const …Run Code Online (Sandbox Code Playgroud) 在下面的课程中,
你为什么要做运营商explicit?我认为这explicit是为了防止对构造函数的隐式调用?
class Content
{
public:
virtual ~Content() = 0;
virtual explicit operator float&();
virtual explicit operator long long&();
virtual explicit operator std::string&()
}
Run Code Online (Sandbox Code Playgroud) 我使用 Android 4.0.1 和 Kotlin 1.4.10。我试图插入:
kotlin {
explicitApi()
}
Run Code Online (Sandbox Code Playgroud)
在模块 build.gradle 文件的顶层,但 Android Studio 似乎忽略了它。
我试图在块中插入相同的android { ... }块,但 Android Studio 似乎忽略了它。
我试图插入explicitApi()的android.kotlinOptions { ... }块,但摇篮工程同步失败。