/* A Programmer's Introduction to C# (Second Edition) by Eric Gunnerson Publisher: Apress L.P. ISBN: 1-893115-62-3 */ // 31 - InteropCalling Native DLL FunctionsCalling a Function with a Structure Parameter // copyright 2000 Eric Gunnerson using System; using System.Runtime.InteropServices; struct Point { public int x; public int y; public override string ToString() { return(String.Format("({0}, {1})", x, y)); } } struct Rect { public int left; public int top; public int right; public int bottom; public override string ToString() { return(String.Format("({0}, {1}) ({2}, {3})", left, top, right, bottom)); } } struct WindowPlacement { public uint length; public uint flags; public uint showCmd; public Point minPosition; public Point maxPosition; public Rect normalPosition; public override string ToString() { return(String.Format("min, max, normal: {0} {1} {2}", minPosition, maxPosition, normalPosition)); } } public class CallingaFunctionwithaStructureParameterWindow { [DllImport("user32")] static extern int GetForegroundWindow(); [DllImport("user32")] static extern bool GetWindowPlacement(int handle, ref WindowPlacement wp); public static void Main() { int window = GetForegroundWindow(); WindowPlacement wp = new WindowPlacement(); wp.length = (uint) Marshal.SizeOf(wp); bool result = GetWindowPlacement(window, ref wp); if (result) { Console.WriteLine(wp); } } }
Class Interface
C# always creates a structure instance as a value-type variable even using the new operator
/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ // // ValType.cs -- Demonstrates that C# always creates a structure instance as // a value-type variable even using the new operator. // Compile this program using the following command line: // C:>csc ValType.cs // namespace nsValType { using System; public struct POINT { public int cx; public int cy; } public class ValType { static public void Main() { POINT point1; point1.cx = 42; point1.cy = 56; ModifyPoint (point1); Console.WriteLine ("In Main() point2 = ({0}, {1})", point1.cx, point1.cy); POINT point2 = new POINT (); // point2.cx = 42; // point2.cy = 56; Console.WriteLine (); ModifyPoint (point2); Console.WriteLine ("In Main() point2 = ({0}, {1})", point2.cx, point2.cy); } static public void ModifyPoint (POINT pt) { pt.cx *= 2; pt.cy *= 2; Console.WriteLine ("In ModifyPoint() pt = ({0}, {1})", pt.cx, pt.cy); } } }
Illustrates the use of a struct
/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example5_15.cs illustrates the use of a struct */ // declare the Rectangle struct struct Rectangle { // declare the fields public int Width; public int Height; // define a constructor public Rectangle(int Width, int Height) { this.Width = Width; this.Height = Height; } // define the Area() method public int Area() { return Width * Height; } } public class Example5_15 { public static void Main() { // create an instance of a Rectangle System.Console.WriteLine("Creating a Rectangle instance"); Rectangle myRectangle = new Rectangle(2, 3); // display the values for the Rectangle instance System.Console.WriteLine("myRectangle.Width = " + myRectangle.Width); System.Console.WriteLine("myRectangle.Height = " + myRectangle.Height); // call the Area() method of the Rectangle instance System.Console.WriteLine("myRectangle.Area() = " + myRectangle.Area()); } }
Issue an error message if you do not initialize all of the fields in a structure
/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ // // Struct.cs - Issue an error message if you do not initialize all of // the fields in a structure // // Compile this program with the following command line: // C:>csc Struct.cs // using System; namespace nsStruct { struct POINT { public int cx; public int cy; public int var; public override string ToString () { return ("(" + cx + ", " + cy + ")"); } } public class StructDemo2 { static public void Main () { POINT pt; pt.cx = 24; pt.cy = 42; Console.WriteLine (pt); // Console.WriteLine ("(" + pt.cx + ", " + pt.cy + ")"); } } }
Demonstates assignment operator on structures and classes.
/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ // // CmpStCls.cs -- Demonstates assignment operator on structures and classes. // Compile this program with the following command line: // C:>csc CmpStCls.cs // namespace nsCompare { using System; // // Define a structure containing the x and y coordinates of a point struct stPoint { public int cx; public int cy; } // // Define a class containing the x and y coordinates of a point class clsPoint { public int cx; public int cy; } public class CmpStCls { static public void Main () { // Declare two structure variables stPoint spt1, spt2; // Initialize the members of only one structure spt1.cx = 42; spt1.cy = 24; // Assign the first structure to the first spt2 = spt1; // Now modify the first structure spt1.cx = 12; spt1.cy = 18; // Show the results Console.WriteLine ("For structures:"); Console.WriteLine (" The point for spt1 is ({0}, {1})", spt1.cx, spt1.cy); Console.WriteLine (" The point for spt2 is ({0}, {1})", spt2.cx, spt2.cy); // Now do the same thing with instances of the class clsPoint cpt1, cpt2; cpt1 = new clsPoint(); // Initialize the members of only one class instance cpt1.cx = 42; cpt1.cy = 24; // Assign the first class instance to the second cpt2 = cpt1; // Modify the first class cpt1.cx = 12; cpt2.cy = 18; // Show the results Console.WriteLine (" For structures:"); Console.WriteLine (" The point for cpt1 is ({0}, {1})", cpt1.cx, cpt1.cy); Console.WriteLine (" The point for cpt2 is ({0}, {1})", cpt2.cx, cpt2.cy); } } }
demonstrates using a structure to return a group of variables from a function
/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ // tm.cs - demonstrates using a structure to return a group of variables // from a function // // Compile this program using the following command line: // D:>csc tm.cs // namespace nsStructure { using System; using System.Globalization; public struct tm { public int tm_sec; // Seconds after the minute public int tm_min; // Minutes after the hour public int tm_hour; // Hours since midnight public int tm_mday; // The day of the month public int tm_mon; // The month (January = 0) public int tm_year; // The year (00 = 1900) public int tm_wday; // The day of the week (Sunday = 0) public int tm_yday; // The day of the year (Jan. 1 = 1) public int tm_isdst; // Flag to indicate if DST is in effect } public class tmDemo { static public void Main() { DateTime timeVal = DateTime.Now; tm tmNow = LocalTime (timeVal); string strTime = AscTime (tmNow); Console.WriteLine (strTime); } static public tm LocalTime(DateTime tmVal) { tm time; time.tm_sec = tmVal.Second; time.tm_min = tmVal.Minute; time.tm_hour = tmVal.Hour; time.tm_mday = tmVal.Day; time.tm_mon = tmVal.Month - 1; time.tm_year = tmVal.Year - 1900; time.tm_wday = (int) tmVal.DayOfWeek; time.tm_yday = tmVal.DayOfYear; TimeZone tz = TimeZone.CurrentTimeZone; time.tm_isdst = tz.IsDaylightSavingTime (tmVal) == true ? 1 : 0; return (time); } // // Returns a string representing a time using UNIX format static public string AscTime (tm time) { const string wDays = "SunMonTueWedThuFriSat"; const string months = "JanFebMarAprMayJunJulAugSepOctNovDec"; string strTime = String.Format ("{0} {1} {2,2:00} " + "{3,2:00}:{4,2:00}:{5,2:00} {6} ", wDays.Substring (3 * time.tm_wday, 3), months.Substring (3 * time.tm_mon, 3), time.tm_mday, time.tm_hour, time.tm_min, time.tm_sec, time.tm_year + 1900); return (strTime); } } }
Defining functions for structs
using System; struct Dimensions { public double Length; public double Width; Dimensions(double length, double width) { Length = length; Width = width; } public double Diagonal { get { return Math.Sqrt(Length * Length + Width * Width); } } }