473,842 Members | 1,838 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Another C# critique

I have posted a C# critique at
http://www.heron-language.com/c-sharp-critique.html. To summarize I bring up
the following issues :

- unsafe code
- attributes
- garbage collection
- non-deterministic destructors
- Objects can't exist on the stack
- Type / Reference Types
- Boxing / Unboxing
- Mutability
- Classes as Modules and Programs
- Polymorphism through Class Inheritance
- Interface Delegation
- Interface Extensions
- C# Missing Template Template Parameters
- Late Added Generics
- Source File Layout
- Public Fields
- Special Primitives
- Is it a Property or is it a field?
- Microsoft

I am perhaps guilty somewhat of being a flame baiting troll, but at the same
time I honestly want to improve on the critique.

Thanks in advance for your responses.

--
Christopher Diggins
yet another language designer
http://www.heron-language.com
Nov 15 '05
188 7272
christopher diggins <cd******@video tron.ca> wrote:
In fact, a reference can't be const - only a variable can be const, and
the only type of reference variable that can be const is a string one.
Quote from MSDN :

The const keyword is used to modify a declaration of a field or local
variable. It specifies that the value of the field or the local variable
cannot be modified
...
One of the types: byte, char, short, int, long, float, double, decimal,
bool, string, an enum type, or a reference type.

http://msdn.microsoft.com/library/de...us/csref/html/
vclrfconstpg.as p

This would seem to contradict you.


Slightly. Of course, you didn't keep quoting to:

<quote>
Therefore, the only possible values for constants of reference types
are string and null.
</quote>

So yes, although I was slightly wrong, I think in practice the only
type of reference variable that is *usefully* const is a string one, as
everything else would have to be null.
Const is for constants, and constants aren't the same as immutable
objects.


A const variable is an immutable variable though an immutable
variable is not neccessarily const. Do you not agree with me on that one?


Yes. const fields are much more restricted than just readonly variables
though. const
Nonetheless, I still stand by my statement as in the critique.


Unless I'm mistaken, the actual wording of your statement has now
changed anyway...

--
Jon Skeet - <sk***@pobox.co m>
http://www.pobox.com/~skeet
If replying to the group, please do not mail me too
Nov 15 '05 #71
Why not? I heard that this was coming sometime, 2.1 then? We need the
ability to embed an assembly into anotiher assembly (.exe).

"Willy Denoyette [MVP]" <wi************ *@pandora.be> wrote in message
news:Oe******** ******@TK2MSFTN GP09.phx.gbl...
As I told you before C# 2.0 doesn't have .lib and static linking. Static
linking involves a native code compiler and a linker, these are the domain
of C++.

Willy.

<di********@dis cussion.microso ft.com> wrote in message
news:O7******** ********@TK2MSF TNGP10.phx.gbl. ..
As for preprocessors, theyre evil, hard to debug and just not good in any way to have mixed compiled code.

I prefer to use a const value rather than conditional compile, at least C# has reduced this need by having defines limited to true or false values,
still I would prefer it not there at all.

The lack of .lib static linking was a bad thing to not have, thankfully
its
back in 2.0.


Nov 15 '05 #72
"Matthew W. Jackson" <th************ ********@NOSPAM .NOSPAM> wrote in message
news:en******** ******@TK2MSFTN GP10.phx.gbl...
With templates and generics, Complex<float> becomes a type of it's own, just like Object or float. Therefore there's no reason why Array<Complex<f loat>> wouldn't work. If you have an Array<T>, then T can certainly be passed
Complex<float>.

I think you're getting parameter and argument confused. The generic type
argument CAN be a generic type.

The generic type parameter cannot be a generic. For example, in C++
templates you can define a class such as this:

template < template < class A > class B >
class MyTemplateTempl ateClass {
};

I've never used this, and many C++ compilers don't even support it.
Microsoft's didn't until very recently.

I've seen a few good uses of these in C++, but I can't honestly think of how it would be useful in C# (at least with generics being implemented as they
are in C#).

And to do Array<Complex<f loat>> in C++ you don't need a template template
parameter.

--Matthew W. Jackson

How silly of me to confuse arguments and parameters! Thank you very much.
Now I understand.

--
Christopher Diggins
yet another language designer
http://www.heron-language.com
Nov 15 '05 #73
"Rob Teixeira [MVP]" <RobTeixeira@@m sn.com> wrote in message
news:%2******** ********@TK2MSF TNGP09.phx.gbl. ..
GC:
Problem #2 : Unsafe contexts. There is a problem of being able to modify managed types.
This significantly undermines the effectiveness of a GC and renders all

unsafe code as
potentially having classes of errors which are normally removed by a GC

mechanism.
From the language specification :


There are certainly issues that can come up from misuse of unsafe code.

The example you cited from the MSDN talks about strings, for example. Strings
are immutable types in the CLI/CLR, which allows the CLR to do
optimizations. For example, assigning one string ref to another doesn't copy the contents. Since the runtime knows strings shouldn't change, both
references point at the same character array until one is assigned to a
different value. If you use unsafe code with one ref, and change the value, you are inadvertantly changing another string ref's data as well, which
could cause a series of bugs. However, this in no way affects the GC. The
objects themselves live on the managed heap, and the GC will eventually get around to cleaning them. I *strongly urge* you to read up on the GC and how it works internally. Having said that, let's look at a problem with our
string scenario that can't be solved without unsafe or unmanaged code -
let's say you create one string variable and decrypt cipher data into it
containing a password (or any secret bit of info - credit card number,
etc.). You do what you need to do in your function, and when the function
ends, your string variable goes out of scope. The string is now elegible for collection. However, you have no idea how long it will remain in memory.
It's possible that it's there for some time, and let's say it gets paged
out. Now, a clever hacker can sniff through your page file for secret data, and it will show up. Programmers who are wary of security concerns need to
wipe secrets out of memory as quickly as possible. Knowing that there is
only ever one reference to the string, there is no reason I can't pin that
string, and using unsafe or unmanaged code, zero it out. You may not like
unsafe code, and it does have the potential of burning developers who don't know what they're doing, but it does have its legitimate uses. Remember that you can turn off this feature by not allowing the compiler switch to be used by your development team. C# will not compile unsafe code by default. You do not mention that in your text.
I think I shouldn't confuse the compiler with the language spec. The
language spec clearly talks about unsafe contexts. What a compiler defaults
to is not a concern IMO. I agree on a whole that unsafe code has its uses.
And we both agree that it can burn developers who don't know what they are
doing (or who work with such people, etc.). The fact that a feature can be
unallowed (and of course not used) is true for almost any dangerous feature,
with the right compiler / pre-processor tool. But this does not negate my
critique of the feature in the first place. I also don't think I suggest
that modifying unmanaged code affects the GC. I am trying to indicate that
it undermines the role of the GC to provide a memory protection mechanism.

Are you saying that there should only be either all value types or all
reference types? If so, which one would you use? Languages like Java use
exclusively reference types (except for special case primitives) because it is the most flexible type. However, if you kept all reference types, then
you'd have nothing but types that fit your "perforance penalties". On the
other hand, value types have an enormous number of limitations compared to
reference types, so I can't even fathom a language with all value types.
What's your alternative?
My alternative would that all types can be both value types and reference
types much like C++.
Also, the managed heap doesn't suffer from memory fragmentation like heaps
from certain other languages do. Use of the GC allows all memory to be
allocated sequentially. As objects get collected, the space is compacted by generation. However, let's pretend for a minute this isn't the case. How
does using a non-reference type change the way the heap is used? You are
still allocating and cleaning out memory, and you'd still be leaving
fragments of unallocated space. I don't quite understand this bullet point, or the next one.
Stack allocation is in a fixed location, the same memory is used over and
over again, with no gaps in between.
Finally, if you are using a system that has no reference
types, how can you have references that point to the same data? Would you
have to copy all your data EVERY time? How would you synchronize instances
to maintain semantics of assignment? Wouldn't that suck for performance?
Special Primitives and Immutabilty
"a const field is a compile-time constant"
You still haven't answered my question about how you would allow reference
types (or other user-defined types) to have this behavior. This is where

we need to develop the syntax that allows programmers to specify literal values for what could be relatively complex object graphs, THEN on top of that, the compiler needs to have a mechanism to store this data in the program AND
reconstitute it at runtime. Then we run into the problem of read-only (which C# can do) vs. immutability. If you reconstitute the value at runtime by
normal instantiation, you are only creating a read-only value (which C# can already do). If you reconstitute the value in a truly const manner, you
effectively bypass constructors, which is disasterous. This is why all
languages i can think of don't allow this. If you are suggesting that C# is doing something that is less than ideal, what is your ideal solution?
C# does not support delegating interface implementations to member classes.
This significantly restricts the ability to use interfaces extensively.


Example? I'm not entirely disagreeing with you, but I'm wondering if we

are exaggerating the problem by using "extensivel y"?
If I wanted to "extensivel y use" interfaces I would be writing hundreds or
even thousands of implementation delegation functions.
The reason I'm not disagreeing entirely is that i'm not exactly fond of the syntax C# uses for implementing interfaces. However I disagree that C# can't do this. It is perfectly capable of delegating interface method calls to
member classes... I think you mean delegating the method call to a method of a *contained* class (rather than nested class, right?). Anyway, again, C# is perfectly capable of doing this.
Ah, yes. This will be important for me to differentiate.
Missing Interface Extensions


Example please? Are you assuming that you can't define Interfaces in C#?
That's what this is reading like, and that certainly isn't true at all. C#
allows you to write classes, abstract classes, AND stand-alone interfaces.
Interfaces in C# have no implementation and are not tied to a class
definition, so I'm confused at what you mean in your statement. Class
inheritance is NOT the only means of polymorphism in C#. That is also an
incorrect statement. You can certainly implement interfaces and create
interfaces. Please clarify this point, because I don't think you

understand what C# is doing here.
I did not say nor intend to suggest that class inheritance is the only kind
of polymorphism. I am trying to point out a feature which would adds
significant expressiveness to interfaces but is missing. This feature only
exists in Heron as far as I know. I wrote a short paper about extensions at
http://www.heron-language.com/extensions.html. To summarize my viewpoint :
an extension allows an interface to perform even more like an abstract base
class. Adding it would allow code to use interfaces even more instead of
having to resort to abstract base classes in certain design scenarios. Is
this more clear? Any suggestions on how I can clear up things here?
Source File Layout
[The lack of seperate and explicit definitions, aka header files]
promotes an unstructured coding style and often leads to bugs that are not immediately obvious without reading the automatically generated

documentation.

I'm not sure I agree with this. What type of bugs are we talking about

here and how do we know this happens often? If you make an assertion, you are
going to have to back it up or qualify it. You may *prefer* to have header
files for various reasons, but you shouldn't make a blanket statement about bugs without having data to prove it, or at the very least giving a good
example (or more) of what types of bugs we're dealing with here. I also
think you are going to have to explain why header files are better in your
opinion than documentation.. . in a sense, they are both being viewed here as documentation here, and both are nothing but text at this point.

-Rob Teixeira [MVP]


I just touched this bit up. Between you and me what I am trying to get at
are situiations like where because all of the member fields are not obvious
a programmer can accidentally add an extra field for the same purpose as one
that already exists because they forgot it was there, asnd the same thing
for functions. Forgetting where in the design they are, etc. Little silly
things like that that are easily recoverable.

Excellent points Rob! I have adjusted some of the points you mentioned to
try and make them more technically accurate and more clear. Maybe I will
have a critique that is actually worth something sometime soon.

--
Christopher Diggins
yet another language designer
http://www.heron-language.com

Nov 15 '05 #74
I'd just like to butt-in on question 12, public fields. One of my favourite
C++ questions (with no right or wrong answer) is: "given that we don't like
public data fields, and given that the people who implement STL libraries
are pretty smart, why is pair<A, B> generally implemented with two public
data fields?"


"christophe r diggins" <cd******@video tron.ca> wrote in message
news:HO******** **********@webe r.videotron.net ...

"William Ryan" <do********@nos pam.comcast.net > wrote in message
news:%2******** ********@TK2MSF TNGP09.phx.gbl. ..
1) Unsafe Code - Sometimes you need it, plain and simple.
Then I would argue it illuminates weakness in the language to begin with.
2) Attributes - Huh? Take for example FileIOPermissio n attribute...you

can
mark 10 different directories with only Read permissions thereby

eliminating
the need for checking hardcoded values and ugly branch logic before

reading
or writing a file.


You haven't eliminated ugly branch logic. It is just hidden in the
attribute. Because something has been moved into a library and looks

pretty is not sufficient. There are other attributes that people write that are a
complete mystery making understanding someone else's code a real headache
because the branch logic is no longer apparent.
I could go on and on about this, but I think you are way
off base here. And you aren't forced to use them...I bet there are tons of
.NET developers that barely know they exist for God's sake.


Yes, but when they use them wrongly it is the biggest nightmare you can
imagine. (i.e. My code doesn't work, oh I see the problem this harmless
little attribute is written wrong).
3- Garbage Collection - Yes, all of the benefits you get from Managed code aren't totally free.


Yep. And some of us just plain don't want a GC. Hence the title, "Why I
don't use C#"
4- Allows non-deterministic destructors - If you dispose of your objects
when you are done with them, I'm not sure what the problem is. What

problem
is this causing you?


The destructor gets called when the Garbage collector deallocates the
memory. When will that happen?
5- Type/Reference Types.... Dude, there's so few value types I could

recite
them off the top of my head. That's hardly a chore and so simple most
college CS freshman would love to have that as a Question on a test
As far as Objects can't exist on the stack....that's part and parcel to

your
other complaint


Plus user defined structs.
7-Mutability - Ok, but what does that stop you from doing? Couldn't you

use
Attributes to set the objects value and not provide accessors to change

it?

A guarantee of immutability of object across functions and modules is
important for designing well behaved and correct software.
8-Class as Modules and Programs - <<A static class with only static data

and
static methods should either be a module or a program.>> Why?


Okay, I definitely don't have enough ammo to back this one up.
9-Polymorphism - Why can't you use multiple Interfaces?


You can, but you have to redeclare every function in every class that
implements an interface. That can quickly become really unmaintainable

with sophisticated interfaces.
10-Generics and Missing Templates.... ok, they didn't get everything up
front, but if you want to use it, use it, if not, don't. Would it be better
for them to not provide this functionality? What if you were just

starting
C# programming with the advent of 2.0 and didn't have legacy code?

Wouldn't
you want generics?


I am just saying that they missed the boat, and are now grafting it on
painfully with some important features missing.
11- Source File Layout - Can't you get all of that information via
reflection or using the CodeModel?


Yes you can. I meant parsing as in reading source code is hard to do.
12 - Public Fields---Not if you don't do it. Is it really Microsoft's
responsibilty to ensure that every programmer doesn't violate the rules of OOP?


A language has a responsability to try and make it difficult to write bad
code.
Besides, if they tried stopping this, there'd be so many VB
Programmers screaming bloody murder it wouldn't be funny.


Replace them all with properties I say (public fields not the VB
Programmers)
And while I
believe that you shouldn't break encapsulation, there are lots of people
that have...or have inherited code from people that did and prohibiting it would impede adoption. Say what you want about MS, they bend over

backwards
to support legacy code.


C# is a new language, it doesn't need to support legacy code. It is
incompatable with all other languages.
Special Primitives - Once again, so what?


I can't write my own.
13- Is it a field..
If it were a function, you'd see the () around it. Go ahead and try, if

you
don't put the parens around it, it won't compile. As testimony to this,

go
see how many VB Programmers constantly complain about forgetting the

parens
when they call ToString without the Parens.


What I am referring to is that assigning to a property behind the scenes

can map to a Set function call.
And finally, other than the issue of unsafe code which VB.NET doesn't
support, aren't all of these related to the CLR and the Framework rather
than C#?


Nope. All of these issues are part of the C# specification.
--
Christopher Diggins
yet another language designer
http://www.heron-language.com

Nov 15 '05 #75
No problem.

I too would have been pissed if C# wouldn't support Array<Complex<f loat>>.

Of course, I'm pretty sure that a generic Complex class in C# will require a
second type parameter in order to support numeric operations on the type,
but that's another matter. At first it bothered me, until I came across an
elegant solution involving a helper class to do the arithmetic. Then I came
across an even more elegant solution involving a Generic abstract class to
emulate template-specialization, but that's off topic for this discussion so
I'll leave it at that.

--Matthew W. Jackson
"christophe r diggins" <cd******@video tron.ca> wrote in message
news:pM******** *********@weber .videotron.net. ..
"Matthew W. Jackson" <th************ ********@NOSPAM .NOSPAM> wrote in message news:en******** ******@TK2MSFTN GP10.phx.gbl...
With templates and generics, Complex<float> becomes a type of it's own,

just
like Object or float. Therefore there's no reason why

Array<Complex<f loat>>
wouldn't work. If you have an Array<T>, then T can certainly be passed
Complex<float>.

I think you're getting parameter and argument confused. The generic type argument CAN be a generic type.

The generic type parameter cannot be a generic. For example, in C++
templates you can define a class such as this:

template < template < class A > class B >
class MyTemplateTempl ateClass {
};

I've never used this, and many C++ compilers don't even support it.
Microsoft's didn't until very recently.

I've seen a few good uses of these in C++, but I can't honestly think of

how
it would be useful in C# (at least with generics being implemented as they are in C#).

And to do Array<Complex<f loat>> in C++ you don't need a template template parameter.

--Matthew W. Jackson

How silly of me to confuse arguments and parameters! Thank you very much.
Now I understand.

--
Christopher Diggins
yet another language designer
http://www.heron-language.com

Nov 15 '05 #76
"Stu Smith" <st*****@remove .digita.com> schrieb im Newsbeitrag
news:eO******** ******@TK2MSFTN GP12.phx.gbl...
I'd just like to butt-in on question 12, public fields. One of my favourite C++ questions (with no right or wrong answer) is: "given that we don't like public data fields, and given that the people who implement STL libraries
are pretty smart, why is pair<A, B> generally implemented with two public
data fields?"


Uuuh...Performa nce? But wait! What was the Jit good for?
Yes, it can automatically inline calls to Properties. So what?

--
cody

[Freeware, Games and Humor]
www.deutronium.de.vu || www.deutronium.tk
Nov 15 '05 #77
> - unsafe code

You have to place the unsafe-modifier in front of Methods that use unsafe
code
and compile with /unsafe that unsafe code is accepted, what else do you
want?
When using Interop some Functions called from native dll's returns their
results in form
of pointers so what would you do without pointers in c#?
- attributes
They can give the Compiler lots of Information about an Method, Optimization
hints,
and so on. Some Attributes are good for the Windows Forms Designer, an
Attribute
can tell it Wheather a Property should displayed in the Toolbox or not.
- garbage collection
You contradict yourself. What do you want? Unsafe code where you have to
free the
memory manually or Automatically? Thanks to GC memory allocation is much
faster
than in C/C++.
- non-deterministic destructors
Deterministic destructors are good for deallocating native resources only.
Theoretically
they could make dtors of value-types deterministic, but they don't. I don't
know why.
- Objects can't exist on the stack
You remember what happened in C++ when you declare an Object on the Stack,
store its Reference and use it elsewhere? Right, a GPF or undefined
behaviour.
- Type / Reference Types
- An extra word is always needed for the pointer
Why word? Why "extra". A Reference in C# comsumes exactly the same space as
a
Reference in C++ does. 4 Bytes.
- There are more allocations on the heap than are strictly neccessary leading to memory fragmentation

Thanks to Mark&Sweep GC there is *no* memory fragmentation.
- Dereference of pointer penalty
Better than to always passing the whole object on the Stack.
- Boxing / Unboxing
What is better?

Console.WriteLi ne("{0} + {1} = {2}", a, b, c);

or

Console.WriteLi ne("{0} + {1} = {2}", new Integer(a), new Integer(b), new
Integer(c));
- Mutability
Huh? You can make very class or struct immutable when you declare no methods
that
can modify the state of the object. Thats what they did with System.String
for example.
- Classes as Modules and Programs
Maybe it could useful for allday use function like abs, sin, cos. But
misused leads to
programs that only have loose functions which aren't encapsulated in a
class.
At the end, you have prodedural programming is that what you want?
- Polymorphism through Class Inheritance
- Interface Delegation
- Interface Extensions
Huh?
- C# Missing Template Template Parameters
If that is really true, I'll hate them for that.
- Late Added Generics
Yes Indeed. The whole class-Library could have been done better with
Generics.
- Source File Layout
Isn't that what an automatically generated helpfile is good for? I hated it
in C++ where
I always when I wanted to modify a method's signature I had to do it in two
locations.
This was always very annoying.
- Public Fields
Sometimes you make Ad-Hoc code to see if it works the way you though. It
would
be annoying that I must declare every field in a class as a property. Our
app has some
classes with over 40 public field. Making them all a property which does
nothing than
returning and setting that variable would be very stupid, it gains nothing
but bloating code.
- Special Primitives
You can declare you own datatype in C# and make it feel real with operator
overloading.
For example you could declare a 24-Bit Integer and use it exactly as you
would be using an int.
- Is it a Property or is it a field?
You don't have to know that. Why? This is the implementor's concern. If
there is a
property "Color" you know that it can set or get the "Color". Does it matter
how it is
Implemented?
o.x = y;

can mean very different things depending on the following conditions :
Is x or y a property or variable?
[...]
Is o an object reference or a struct value?
The question is: Does that matter? You know what you have to know: You are
assigning y to o.x. All other things are implementation details that should
not be exposed.
- Microsoft


Yes. That is the biggest reason for me to hate C#. But for all other Reasons
I love C#.

One last question: What is your favourite programming language(s)?

--
cody

[Freeware, Games and Humor]
www.deutronium.de.vu || www.deutronium.tk
Nov 15 '05 #78
> What is it about my brain? I am having trouble expressing the whole
non-constness thing. What I mean to say is that I can't have a const
instance of a type. Even though the reference itself can be const.


The whole const-stuff in C++ is stupid. Classes should be self-contained,
and therefore everybody should be able to modify them safely. This is
real-world,
or do you know objects in the real world that are constant? :)

Maybe in C++ it was neccesary due to the whole pointer-stuff and so on but
in other
languages it is not.

--
cody

[Freeware, Games and Humor]
www.deutronium.de.vu || www.deutronium.tk
Nov 15 '05 #79
> *** NO MULTIPLE INHERITANCE ***!!!

Biggest fault of C# in my opinion.


If you can state only one example where multiple nheritance is required I'll
believe you,
otherwise not. Multiple Inheritance is just bad style used by poor
programmers.
All Multiple Inheritance scenarios are best solved using composition
instead.

--
cody

[Freeware, Games and Humor]
www.deutronium.de.vu || www.deutronium.tk
Nov 15 '05 #80

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

14
3749
by: Long | last post by:
How to include an HTML doc in another HTML doc Problem: to insert the body section of an HTML doc in another HTML document at a specific location. One possible way is to add a WebCharm tag like this: <%@charm:html 20 0 my_services.htm %> When the HTML template is processed by a WebCharm-aware web server, the
19
2561
by: TC | last post by:
Are there any good sites or forums for a web critique? I went to alt.html.critique and it's pretty dead.
9
2290
by: bowsayge | last post by:
Inspired by fb, Bowsayge decided to write a decimal integer to binary string converter. Perhaps some of the experienced C programmers here can critique it. It allocates probably way too much memory, but it should certainly handle 64-bit cpus :) #include <stdio.h> #include <stdlib.h> char * to_binary (unsigned long value) {
39
1947
by: Eric | last post by:
There is a VB.NET critique on the following page: http://www.vb7-critique.741.com/ for those who are interested. Feel free to take a look and share your thoughts. Cheers, Eric. Ps: for those on comp.programming, this may be off topic, but I've posted there because the critique was part of a discussion in that group.
0
9867
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
10939
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10609
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10669
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
10308
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
9449
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
7028
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5882
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
2
4086
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.